我有一个带有时间序列数据的(虚拟)数据框:
datetime <- as.POSIXct(seq(ISOdate(2012,12,22), ISOdate(2012,12,23), by="hour"), tz='EST')
data <- rnorm(25, 10, 5)
df <- data.frame(datetime, data)
我还有一个单独的数据框,其开始和结束时间为两列:
start <- as.POSIXct(c('2012/12/22 19:53', '2012/12/22 23:05'), tz='gmt')
end <- as.POSIXct(c('2012/12/22 21:06', '2012/12/22 23:58'), tz='gmt')
index <- data.frame(start, end)
我想做的是“提供”主数据框'df''索引'数据框,并且,对于每个开始和结束日期/时间组合,找到其中“数据”的平均值日期/时间范围。这相当于为每个开始/结束时间手动执行'df'的子集,但是以组合的方式。 (我的真实数据集包含多年的数据,以及我希望为其提供的一百个日期/时间范围。)
最终目标是在这些时间内有三列,开始时间,结束时间和“数据”的平均数值。
答案 0 :(得分:1)
通常,您不希望通过调用rbind
一次增加一行数据框,因为效率非常低(有关详细信息,请参阅the second circle of the R inferno)。在您的情况下,您可以使用sapply
来复制此逻辑:
index$mean <- sapply(1:nrow(index), function(i) mean(df[df$datetime >= index$start[i] &
df$datetime <= index$end[i],2]))
index
# start end mean
# 1 2012-12-22 19:53:00 2012-12-22 21:06:00 9.563336
# 2 2012-12-22 23:05:00 2012-12-22 23:58:00 NaN
答案 1 :(得分:0)
我想出了如何用for循环来做到这一点。如果有人有更有效的解决方案,那就太好了。 for循环解决方案:
d <- data.frame()
for i in (1:nrow(index)) {
d <- rbind(d, mean(subset(df, datetime >= index[i,1] &
datetime <= index[i,2])[,2]))}