【问题标题】:R: data.table aggregate using external grouping vectorR:使用外部分组向量的data.table聚合
【发布时间】:2018-07-23 22:07:51
【问题描述】:

我有数据

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 函数吗?

【问题讨论】:

    标签: r data.table aggregation


    【解决方案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]
    

    【讨论】:

    • 更惯用的方法可能是在连接中执行此操作,并且可以说最好不要覆盖dt,例如dt[.(seq(min(time), max(time), by="mins")), on=.(time), .(s = sum(y, na.rm = TRUE), .N), by=.EACHI]
    猜你喜欢
    • 2014-09-14
    • 1970-01-01
    • 2014-09-02
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多