2

数年間の毎時データのデータフレーム (ボール) に基づいて、風速の日周期を作成しています。季節ごとにプロットしたいので、必要な日付をサブセット化し、次のように結合します。

b8 = subset(ball, as.Date(date)>="2008-09-01 00:00:00, GMT" & as.Date(date)<= "2008-11-30 23:00:00, GMT"  )
b9  = subset(ball, as.Date(date)>="2009-09-01 00:00:00, GMT" & as.Date(date)<= "2009-11-30 23:00:00, GMT"  )
b10 = subset(ball,  as.Date(date)>="2010-09-01 00:00:00, GMT" & as.Date(date)<= "2010-11-30 23:00:00, GMT")
ballspr = rbind(b8,b9,b10)

次に、これを使用して日周期を取得します。

sprwsdiurnal <- aggregate(ballspr["ws"], format(ballspr["date"],"%H"),summary, na.rm=T)

4 つの季節のうち 3 つの季節について、次の構造を持つオブジェクトを作成します。

   date                                               ws
1    00  0.200, 1.000, 1.600, 2.021, 2.500, 8.000, 5.000
2    01  0.100, 1.000, 1.600, 1.988, 2.500, 8.600, 1.000
3    02  0.100, 1.000, 1.700, 1.982, 2.600, 8.900, 1.000

...24時間まで...

23   22  0.100, 1.200, 1.800, 2.222, 2.950, 9.100, 1.000
24   23  0.100, 1.000, 1.600, 2.072, 2.700, 8.800, 1.000

boxplot がこれで動作するので、これは私が望むものです:

par(  mar = c(5, 5, 2, 2))
boxplot(sprwsdiurnal$ws, col="dodger blue",pch=16,font.lab=2,cex.lab=1.5,cex.axis=2,xlab="Hour",range=0, ylab=quote(Windspeed ~ "(" * m ~ s ^-1 * ")"),xaxt="n",main="Spring")
axis(1, at=seq(1,24, by=1),labels=seq(1,24, by=1),cex.axis=1.5, cex.lab=1.5, font.lab=2)

問題は、あるシーズンが次のように出てくることです。

      date ws.Min. ws.1st Qu. ws.Median ws.Mean ws.3rd Qu. ws.Max. ws.NA's
1    00   0.000      1.300     2.100   2.539      3.200  10.500   2.000
2    01   0.100      1.275     2.100   2.499      3.200   9.800   2.000
3    02   0.200      1.200     2.000   2.514      3.400   9.000   2.000

...24時間まで...

23   22   0.100      1.200     1.950   2.582      3.325  11.900   2.000
24   23   0.100      1.300     2.000   2.585      3.400  11.200   2.000

Boxplot はこの形式では機能しません。各シーズンのすべてのコードが同じで、同じデータフレームからサブセット化されているのに、なぜこれが起こるのか説明できません。なぜ出方が違うのでしょうか?どんなアイデアでも大歓迎です。

編集:これがデータです。これらの 2 つのシーズンを確認しましたが、上記の 2 つの異なる形式が引き続き表示されます。

https://www.dropbox.com/s/v5kss0bgjyhrtw1/ball.csv

ball=read.csv("ball.csv", header=T)
ball$date = as.POSIXct(strptime(ball$date, format = "%Y-%m-%d %H:%M:%S", "GMT"))

win9  = subset(ball, as.Date(date)>="2009-06-01 00:00:00, GMT" & as.Date(date)<= "2009-08-31 23:00:00, GMT"  )
aut9  = subset(ball, as.Date(date)>="2009-03-01 00:00:00, GMT" & as.Date(date)<= "2009-05-31 23:00:00, GMT"  )
spr9  = subset(ball, as.Date(date)>="2009-09-01 00:00:00, GMT" & as.Date(date)<= "2009-11-30 23:00:00, GMT"  )
sum9  = subset(ball, as.Date(date)>="2008-12-01 00:00:00, GMT" & as.Date(date)<= "2009-02-28 23:00:00, GMT"  )


sprdiurnal <- aggregate(spr9["ws"], format(spr9["date"],"%H"),summary, na.rm=T)
par(  mar = c(5, 5, 4, 2))
 boxplot(sprdiurnal$ws, col=colours()[109],pch=16,cex.lab=1.5,cex.axis=1.5,xlab="Hour",range=0, ylab=quote(Wind ~ speed ~ "(" * m * "s" ^-1 * ")"),xaxt="n",main="")
axis(1, at=seq(1,24, by=1),labels=seq(1,24, by=1),cex.axis=1.5, cex.lab=1.5) 

windiurnal <- aggregate(win9["ws"], format(win9["date"],"%H"),summary, na.rm=T)
par(  mar = c(5, 5, 4, 2))
boxplot(windiurnal$ws, col=colours()[109],pch=16,cex.lab=1.5,cex.axis=1.5,xlab="Hour",range=0, ylab=quote(Wind ~ speed ~ "(" * m * "s" ^-1 * ")"),xaxt="n",main="")
axis(1, at=seq(1,24, by=1),labels=seq(1,24, by=1),cex.axis=1.5, cex.lab=1.5)
4

1 に答える 1

5

私が知る限り、「問題」は、summaryin your aggregatefunction for " sprdiurnal" の結果が、R が として保存する長方形のデータセットになることですmatrixNAデータセットは長方形ではないため、R は要約を として保存しlistます。

「iris」データセットでデモを行いますが、最初に、1 つの値を持つ「iris_2」データセットも作成しNAます。

iris_2 <- iris
iris_2$Sepal.Length[10] <- NA

集計出力を比較してみましょう。この場合、2 番目の列だけになります。欠損値のない「アイリス」データセットが、 の 2 番目の「列」として長方形の行列を返すことがわかりますdata.frame。ただし、値が1 つであるためNA、「iris_2」データセットは として保存されます。これは、特定の目的のために必要listなものです。

(irisagg <- aggregate(iris["Sepal.Length"], iris["Species"], summary))[[2]]
#      Min. 1st Qu. Median  Mean 3rd Qu. Max.
# [1,]  4.3   4.800    5.0 5.006     5.2  5.8
# [2,]  4.9   5.600    5.9 5.936     6.3  7.0
# [3,]  4.9   6.225    6.5 6.588     6.9  7.9
(iris_2agg <- aggregate(iris_2["Sepal.Length"], iris_2["Species"], summary))[[2]]
# $`0`
#     Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
#    4.300   4.800   5.000   5.008   5.200   5.800       1 
# 
# $`1`
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   4.900   5.600   5.900   5.936   6.300   7.000 
# 
# $`2`
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   4.900   6.225   6.500   6.588   6.900   7.900 

これをリストに戻す方法を次に示します。

irisagg$Summary <- unlist(apply(irisagg[[2]], 1, list), recursive = FALSE)
irisagg$Summary
# [[1]]
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   4.300   4.800   5.000   5.006   5.200   5.800 
# 
# [[2]]
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   4.900   5.600   5.900   5.936   6.300   7.000 
# 
# [[3]]
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   4.900   6.225   6.500   6.588   6.900   7.900 

もちろん、より直接的なアプローチは、simplify引数 for aggregateand doを利用することです。

(iris_3agg <- aggregate(iris["Sepal.Length"], 
                        iris["Species"], summary, 
                        simplify = FALSE))[[2]]
# $`0`
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   4.300   4.800   5.000   5.006   5.200   5.800 
# 
# $`1`
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   4.900   5.600   5.900   5.936   6.300   7.000 
# 
# $`2`
#    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#   4.900   6.225   6.500   6.588   6.900   7.900 

あなたの例に適用すると、「sprdiurnal」は問題を引き起こしているサブセットです。単独で表示sprdiurnal$wsし、それがマトリックスであることを確認します。リストに変換してみましょう。

sprdiurnal$ws2 <- unlist(apply(sprdiurnal$ws, 1, list), recursive=FALSE)

boxplotこれで、他のシーズンで行っていたのと同じように進めることができます。

boxplot(sprdiurnal$ws2, e..t..c...) 

sprdiurnalまたは、次を使用してオブジェクトを作り直します。

sprdiurnal <- aggregate(spr9["ws"], 
                        format(spr9["date"],"%H"), 
                        summary, na.rm = TRUE, 
                        simplify = FALSE)

で、前と同じように進みます。

于 2013-02-06T20:37:28.367 に答える