我的数据集中填充了多年来每小时的平均风速。我想创建一个“平均年份”,其中每小时计算多年内该小时的平均风速。如何在不循环遍历数据集的情况下执行此操作? 理想情况下,我想循环遍历数据一次,为每一行提取正确的月,日和小时,并将该行中的风速添加到数据框中的右行,其中每个月,每天和每天的聚合小时聚集。是否可以在不提取月,日和小时的情况下执行此操作,然后循环遍历完整的平均年份data.frame以找到正确的行?
一些示例数据:
data.multipleyears <- data.frame(
DATETIME = c("2001-01-01 01:00:00", "2001-05-03 09:00:00", "2007-01-01 01:00:00", "2008-02-29 12:00:00"),
Windspeed = c(10, 5, 8, 3)
)
我想在这样的数据框中聚合:
average.year <- data.frame(
DATETIME = c("01-01 00:00:00", "01-01 01:00:00", ..., "12-31 23:00:00")
Aggregate.Windspeed = (100, 80, ...)
)
从那里开始,我可以继续计算平均值等等。我可能忽略了一些命令,但对于像这样的东西(在伪代码中)会是什么样的正确语法:
for(i in 1:nrow(data.multipleyears) {
average.year$Aggregate.Windspeed[
where average.year$DATETIME(month, day, hour) == data.multipleyears$DATETIME[i](month, day, hour)] <- average.year$Aggregate.Windspeed + data.multipleyears$Windspeed[i]
}
或类似的东西。感谢帮助!
答案 0 :(得分:3)
我预测ddply和plyr包将成为你最好的朋友:)。我创建了一个30年的数据集,每小时随机风速在1到10毫秒之间:
begin_date = as.POSIXlt("1990-01-01", tz = "GMT")
# 30 year dataset
dat = data.frame(dt = begin_date + (0:(24*30*365)) * (3600))
dat = within(dat, {
speed = runif(length(dt), 1, 10)
unique_day = strftime(dt, "%d-%m")
})
> head(dat)
dt unique_day speed
1 1990-01-01 00:00:00 01-01 7.054124
2 1990-01-01 01:00:00 01-01 2.202591
3 1990-01-01 02:00:00 01-01 4.111633
4 1990-01-01 03:00:00 01-01 2.687808
5 1990-01-01 04:00:00 01-01 8.643168
6 1990-01-01 05:00:00 01-01 5.499421
在这30年期间计算每日normalen(30年平均值,这个术语在气象学中使用很多):
library(plyr)
res = ddply(dat, .(unique_day),
summarise, mean_speed = mean(speed), .progress = "text")
> head(res)
unique_day mean_speed
1 01-01 5.314061
2 01-02 5.677753
3 01-03 5.395054
4 01-04 5.236488
5 01-05 5.436896
6 01-06 5.544966
这对我不起眼的两核AMD只需几秒钟,所以我怀疑只需要一次通过数据就不需要了。这些ddply
调用不同聚合(月,季等)的多个可以单独完成。
答案 1 :(得分:2)
您可以使用substr
提取所需日期的一部分,
然后使用tapply
或ddply
汇总数据。
tapply(
data.multipleyears$Windspeed,
substr( data.multipleyears$DATETIME, 6, 19),
mean
)
# 01-01 01:00:00 02-29 12:00:00 05-03 09:00:00
# 9 3 5
library(plyr)
ddply(
data.multipleyears,
.(when=substr(DATETIME, 6, 19)),
summarize,
Windspeed=mean(Windspeed)
)
# when Windspeed
# 1 01-01 01:00:00 9
# 2 02-29 12:00:00 3
# 3 05-03 09:00:00 5
答案 2 :(得分:0)
这是很老的帖子,但我想补充一下。我猜timeAverage in Openair也可以使用。在手册中,有更多timeAverage功能选项。