使用R中的data.table对许多列求和,删除NA

lol*_*tu2 2 r data.table

这是我猜的两个问题.我正在尝试使用data.table包来总结一个大型数据集.假设我的原始大数据集是df1,不幸的是df1有50列(y0 ... y49),我想要3个字段的总和(segmentfield1,segmentfield2,segmentfield3).有没有比输入每个y0 ... y49列更简单的方法呢?与此相关的是,data.table是否有通用的na.rm = T而不是每个总和都输入?

dt1 <- data.table(df1)
setkey(dt1, segmentfield1, segmentfield2, segmentfield3)
dt2 <- dt1[,list( y0=sum(y0,na.rm=T), y1=sum(y1,na.rm=T), y2=sum(y2,na.rm=T), ... 
            y49=sum(y49,na.rm=T) ),
            by=list(segmentfield1, segmentfield2, segmentfield3)]
Run Code Online (Sandbox Code Playgroud)

Ric*_*rta 7

首先,为正在使用的名称创建对象变量:

colsToSum <- names(dt1)  # or whatever you need
summedNms <- paste0( "y", seq_along(colsToSum) )
Run Code Online (Sandbox Code Playgroud)

如果您想将其复制到新的data.table

dt2 <- dt1[, lapply(.SD, sum, na.rm=TRUE), .SDcols=colsToSum]
setnames(dt2, summedNms)
Run Code Online (Sandbox Code Playgroud)

如果是另外,您希望将列附加到原始列

dt1[, c(summedNms) := lapply(.SD, sum, na.rm=TRUE), .SDcols=colsToSum]
Run Code Online (Sandbox Code Playgroud)

至于一般na.rm过程,没有一个特定的data.table,但看看?na.omit?na.exclude

  • 对于没有 na.rm 选项的函数,您可以使用 `function(x) fun(na.omit(.SD))`。 (2认同)