如何通过NA数据从R聚合返回NA?

时间:2014-02-21 14:23:10

标签: r time-series aggregate na

我有一个带有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并且线图显示差距在那个时期(断开的数据点)。

2 个答案:

答案 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)

你想要的是不清楚,但也许你正在寻找一个正确的加入,你可以使用mergeall.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”而不是“数据”。