【问题标题】:Cumsum by group and deal with NAsCumsum 按组并处理 NA
【发布时间】:2017-09-01 09:35:06
【问题描述】:

我有长格式的数据,如下所示:

ID<-c("A","A","B","B","C","C","D","D")
CW<-c(1,2,1,2,1,2,1,2)
Value<-c(1,1,3,3,NA,NA,6,6)
dt<-cbind(ID,CW,Value)

我想为dt$Value 计算cumsum(),结果应该是这样的:

cum<-c(1,1,4,4,NA,NA,10,10)
dt.cum<-cbind(dt,cum)

我将dt 格式化为数据表并尝试了类似:

dt[, cum := cumsum(ifelse(is.na(dt$Value), 0, dt$Value)) +dt$Value*0, by="CW"]

但是,这不起作用。

【问题讨论】:

  • 您能否更准确地解释一下您如何在功能上定义您的cum 列?当CW=1 时,您是否只考虑值?我的意思是:“真正的” cumsum 将是 c(1,2,4,7,(eventually NA), (eventually NA), 13, 19) 你想要一个(不同的)cumsum 每个 CW 值,NA 计数为 0?

标签: r datatable na cumsum


【解决方案1】:

首先,不要使用cbind创建数据框。 cbind 返回一个 matrix,在这种情况下,它的所有元素都被强制转换为 character 类。

dt <- data.frame(ID,CW,Value)

现在,这是一个基本的R 解决方案。函数ave就是针对这类问题的。

dt$cum <- ave(dt$Value, dt$CW, FUN = function(x) cumsum(ifelse(is.na(x), 0, x)))
is.na(dt$cum) <- is.na(dt$Value)
dt$cum
[1]  1  1  4  4 NA NA 10 10

【讨论】:

    猜你喜欢
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2020-12-15
    相关资源
    最近更新 更多