R:使用外部分组向量的data.table聚合

时间:2018-02-13 13:55:13

标签: r data.table aggregation

我有数据

dt <- data.table(time=as.POSIXct(c("2018-01-01 01:01:00","2018-01-01 01:05:00","2018-01-01 01:01:00")), y=c(1,10,9))
> dt
                  time  y
1: 2018-01-01 01:01:00  1
2: 2018-01-01 01:05:00 10
3: 2018-01-01 01:01:00  9 

我希望按time汇总。通常,我会这样做

dt[,list(sum=sum(y),count=.N), by="time"]
                  time sum count
1: 2018-01-01 01:01:00  10     2
2: 2018-01-01 01:05:00  10     1

但是这一次,我还希望在两者之间获得零分值,即

                  time sum count
1: 2018-01-01 01:01:00  10     2
2: 2018-01-01 01:02:00   0     0
3: 2018-01-01 01:03:00   0     0
4: 2018-01-01 01:04:00   0     0
5: 2018-01-01 01:05:00  10     1

可以这样做,例如,使用外部矢量

times <- seq(from=min(dt$time),to=max(dt$time),by="mins")

可以作为分组变量提供给data.table函数吗?

1 个答案:

答案 0 :(得分:1)

您通常会使用联接(在聚合之前或之后)。例如:

dt <- dt[J(times), on = "time"]
dt[,list(sum=sum(y, na.rm = TRUE), count= sum(!is.na(y))), by=time]
#                  time sum count
#1: 2018-01-01 01:01:00  10     2
#2: 2018-01-01 01:02:00   0     0
#3: 2018-01-01 01:03:00   0     0
#4: 2018-01-01 01:04:00   0     0
#5: 2018-01-01 01:05:00  10     1

或者是“管道”版本:

dt[J(times), on = "time"][
  , .(sum = sum(y, na.rm = TRUE), count= sum(!is.na(y))), 
  by = time]