【问题标题】:Rowwise cumulative sum逐行累计和
【发布时间】:2018-04-09 06:47:00
【问题描述】:

我有一个data.table dt 如下。

df <- data.frame(t1 = rep(0,5), t3 = c(12, 5, 8,9, 5), t7= c(25, 48, 7, 9, 14))
dt <- setDT(df)
dt
   t1 t3 t7
1:  0 12 25
2:  0  5 48
3:  0  8  7
4:  0  9  9
5:  0  5 14

我想获得各列的累积总和。我只是在行中得到它。如何在data.table 中执行此操作。

dt[, 1:3 := cumsum(dt)]
dt
   t1 t3  t7
1:  0 12  25
2:  0 17  73
3:  0 25  80
4:  0 34  89
5:  0 39 103

想要的输出如下:

dt
   t1 t3 t7
1:  0 12 37
2:  0  5 53
3:  0  8 15
4:  0  9 18
5:  0  5 19

【问题讨论】:

  • setDT(df) 原地转换,无需赋值

标签: r data.table cumsum


【解决方案1】:

如果我们需要逐行执行此操作,则一个选项是逐行分组unlist,获取cumsum,转换为list 并将其分配给列

dt[, (1:3) := as.list(cumsum(unlist(.SD))), 1:nrow(dt)]
dt
#    t1 t3 t7
#1:  0 12 37
#2:  0  5 53
#3:  0  8 15
#4:  0  9 18
#5:  0  5 19

或者另一个选项是rowCumsums from matrixStats,它可以应用于matrix

library(matrixStats)
dt[, (1:3) := as.data.table(rowCumsums(as.matrix(.SD)))]

【讨论】:

    【解决方案2】:

    另一个选项使用Reduceaccumulate=TRUE

    dt[, names(dt) := Reduce(`+`, dt, accumulate = TRUE)]
    
    dt
    #   t1 t3 t7
    #1:  0 12 37
    #2:  0  5 53
    #3:  0  8 15
    #4:  0  9 18
    #5:  0  5 19
    

    【讨论】:

    • 基于几个测试,这种方法在速度方面大大优于其他方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2021-01-13
    相关资源
    最近更新 更多