我有一个带有POSIXct日期时间列的数据框和一个带有值的列。 该值可能包含NA的周期,有时甚至在几个小时之间滞后(根本没有数据,例如)
t v
2014-01-01 20:00:00 1000
2014-01-01 20:15:00 2300
2014-01-01 20:30:00 1330
2014-01-01 20:45:00 NA
2014-01-01 21:00:00 NA
2014-01-01 22:15:00 NA
2014-01-01 22:30:00 1330
2014-01-01 22:45:00 3333
人们可以很容易地看到有一段时间没有写入数据(21:00至22:15) 我现在申请
aggregate(data, list(t=cut($t, "1hour"), FUN=sum)
它将任何缺失的东西解释为零。当使用ggplot2和geom_line绘制它时,该区域中的曲线将从1000s分解为10s。
我希望aggregate
返回数据未表示的每小时的NA值(缺失或NA本身),这样值不会向下弯曲到0并且线图显示差距在那个时期(断开的数据点)。
答案 0 :(得分:1)
感谢@JulienNavarre和@ user20650,他们都提供了部分解决方案,我在这里提出了我的最终解决方案,它还能够在非常规时间处理数据,并且每小时至少需要x值进行聚合。
data$t <- as.POSIXct(strptime(data$t,"%Y-%m-%d %H:%M:%S"))
x <- 4 # data available x times per hour
h <- 1 # aggregate to every h hours
# aggregation puts NA if data has not x valid values per hour
dataagg <- aggregate(data$v, list(t=cut(data$t, paste(h,"hours"))),
function(z) ifelse(length(z)<x*h||any(is.na(z)),NA,sum(z,na.rm=T)))
dataagg$t <- as.POSIXct(strptime(dataagg$t, '%Y-%m-%d %H:%M:%S'))
# Now fill up missing datetimes with NA
a <- seq(min(dataagg$t), max(dataagg$t), by=paste(h,"hours"))
t <- a[seq(1, length(a), by=1)]
tdf <- as.data.frame(t)
tdf$t <- as.POSIXct(strptime(tdf$t, '%Y-%m-%d %H:%M:%S'))
dataaggfinal <- merge(dataagg, tdf, by="t", all.y=T)
答案 1 :(得分:0)
你想要的是不清楚,但也许你正在寻找一个正确的加入,你可以使用merge
和all.Y = TRUE
。
然后你可以用聚合来分组你的总和。
> data$t <- as.POSIXct(data$t)
>
> time.seq <- seq(min(as.POSIXct(data$t)), max(as.POSIXct(data$t)), by = "min")[seq(1, 166, by = 15)]
>
> merge(data, as.data.frame(time.seq), by.x = "t", by.y = "time.seq", all.y = T)
t v
1 2014-01-01 20:00:00 1000
2 2014-01-01 20:15:00 2300
3 2014-01-01 20:30:00 1330
4 2014-01-01 20:45:00 NA
5 2014-01-01 21:00:00 NA
6 2014-01-01 21:15:00 NA
7 2014-01-01 21:30:00 NA
8 2014-01-01 21:45:00 NA
9 2014-01-01 22:00:00 NA
10 2014-01-01 22:15:00 NA
11 2014-01-01 22:30:00 1330
12 2014-01-01 22:45:00 3333
在这种情况下,aggregate
中的x参数应该是您想要“求和”的变量,然后是“数据$ v”而不是“数据”。