【问题标题】:Skip NAs when using Reduce() in data.table在 data.table 中使用 Reduce() 时跳过 NA
【发布时间】:2020-12-11 22:33:21
【问题描述】:

我正在尝试获取 data.table 行的累积总和,并且能够在另一个 stackoverflow 帖子中找到此代码:

devDF1[,names(devDF1):=Reduce(`+`,devDF1,accumulate=TRUE)]

它做了我需要它做的事情,但是当它遇到以 NA 开头的行时,它只会用 NA 替换该行中的每个元素(而不是该行中其他元素的 cumsum) .我不想用 0 替换 NA,因为我将需要此输出以进行进一步处理,并且不希望在行中重复相同的最终 cumsum。有什么办法可以调整那段代码以忽略 NA?或者是否有替代代码可用于在忽略 NA 的情况下获取 data.table 中行的累积总和?

【问题讨论】:

    标签: r data.table na cumulative-sum accumulate


    【解决方案1】:

    考虑这个例子:

    library(data.table)
    dt <- data.table(a = 1:5, b = c(3, NA, 1, 2, 4), c = c(NA, 1, NA, 3, 4))
    dt
    
    #   a  b  c
    #1: 1  3 NA
    #2: 2 NA  1
    #3: 3  1 NA
    #4: 4  2  3
    #5: 5  4  4
    

    如果您想将先前的值携带到 NA 值,您可以使用:

    dt[, names(dt) := lapply(.SD, function(x) cumsum(replace(x, is.na(x), 0))), 
         .SDcols = names(dt)]
    dt
    
    #    a  b c
    #1:  1  3 0
    #2:  3  3 1
    #3:  6  4 1
    #4: 10  6 4
    #5: 15 10 8
    

    如果您想将NA 保留为NA

    dt[, names(dt) := lapply(.SD, function(x) {
      x1 <- cumsum(replace(x, is.na(x), 0))
      x1[is.na(x)] <- NA
      x1
      }), .SDcols = names(dt)]
    
    dt
    
    #    a  b  c
    #1:  1  3 NA
    #2:  3 NA  1
    #3:  6  4 NA
    #4: 10  6  4
    #5: 15 10  8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-10
      • 2022-08-04
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      相关资源
      最近更新 更多