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)

在四分之三的季节中,这使对象具有以下结构:

   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 不适用于这种格式。我无法解释为什么会发生这种情况,因为每个季节的所有代码都是相同的,并且它们是从同一个数据帧中提取的子集。为什么一个出来的不一样?任何想法表示赞赏。

编辑:这是数据。我检查了这两个赛季,他们仍然给出了上面显示的两种不同的格式。

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

据我所知,“问题”是summary您的aggregate函数中的结果“ sprdiurnal”导致 R 存储为的矩形数据集 a matrix,而对于您的其他子集,因为一些时间包括NA而其他时间不包括数据集不是矩形的,因此 R 将摘要存储为list.

我将使用“iris”数据集进行演示,但首先,我还将创建一个具有一个NA值的“iris_2”数据集。

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

让我们比较一下聚合输出,在这些情况下,它只是第二列。您会看到没有缺失值的“iris”数据集返回一个矩形矩阵作为data.frame. 但是,由于我们只有一个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参数 foraggregate和 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 回答