我试图理解为什么R与“聚合”函数的行为不同。我想平均15m数据到小时数据。为此,我将15m数据与预先设计的“小时”数组(每小时相同日期的4倍,将原始POSIXct数组)一起传递给聚合函数。
过了一段时间,我意识到这个函数表现得很奇怪(好吧,可能数据很奇怪,但为什么?)当用
给出日期数组时strftime(data.15min$posix, format="%Y-%m-%d %H")
但是,如果我用
移交数据cut(data.15min$posix, "1 hour")
数据已正确平均。
下面,嵌入了一个最小的例子,包括数据样本。 我很乐意理解我做错了什么。
提前致谢!
d <- 3
bla <- read.table("test_daten.dat",header=TRUE,sep=",")
data.15min <- NULL
data.15min$posix <- as.POSIXct(bla$dates,tz="UTC")
data.15min$o3 <- bla$o3
hourtimes <- unique(as.POSIXct(paste(strftime(data.15min$posix, format="%Y-%m-%d %H"),":00:00",sep=""),tz="Universal"))
agg.mean <- function (xx, yy, rm.na = T)
# xx: parameter that determines the aggregation: list(xx), e.g. hour etc.
# yy: parameter that will be aggregated
{
aa <- yy
out.mean <- aggregate(aa, list(xx), FUN = mean, na.rm=rm.na)
out.mean <- out.mean[,2]
}
#############
data.o3.hour.mean <- round(agg.mean(strftime(data.15min$posix, format="%m/%d/%y %H"), data.15min$o3), d); data.o3.hour.mean[1:100]
win.graph(10,5)
par(mar=c(5,15,4,2), new =T)
plot(data.15min$posix,data.15min$o3,col=3,type="l",ylim=c(10,60)) # original data
par(mar=c(5,15,4,2), new =T)
plot(data.date.hour_mean,data.o3.hour.mean,col=5,type="l",ylim=c(10,60)) # Wrong
##############
data.o3.hour.mean <- round(agg.mean(cut(data.15min$posix, "1 hour"), data.15min$o3), d); data.o3.hour.mean[1:100]
win.graph(10,5)
par(mar=c(5,15,4,2), new =T)
plot(data.15min$posix,data.15min$o3,col=3,type="l",ylim=c(10,60)) # original data
par(mar=c(5,15,4,2), new =T)
plot(data.date.hour_mean,data.o3.hour.mean,col=5,type="l",ylim=c(10,60)) # Correct
数据:
答案 0 :(得分:1)
评论太长了。
您的结果看起来不同的原因是aggregate(...)
按分组变量对结果进行排序。在第一种情况下,
strftime(data.15min$posix, format="%m/%d/%y %H")
是日期格式不正确的字符向量(它们没有正确排序)。所以第一行对应于&#34; date&#34; "01/01/96 00"
。
在你的第二个案例中,
cut(data.15min$posix, "1 hour")
生成实际的POSIXct日期,这些日期可以正确排序。所以第一行对应日期:1995-11-04 13:00:00
。
如果您使用过
strftime(data.15min$posix, format="%Y-%m-%d %H")
在第一种情况下,您将获得与使用cut(...)