使用R中的data.table对多列求和,去除NA值。

3

这实际上是两个问题。我正在尝试使用data.table软件包对大型数据集进行汇总。假设我的原始大型数据集是df1,不幸的是df1有50列(y0... y49),我想按3个字段(segmentfield1、segmentfield2、segmentfield3)对它们求和。有没有比逐个输入y0...y49列更简单的方法?与此相关的是,是否有data.table的通用na.rm=T选项,而不需要在每个sum中输入它?

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)]

1
@rcs,不完全是重复,但相似。 - Ricardo Saporta
1个回答

7

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

colsToSum <- names(dt1)  # or whatever you need
summedNms <- paste0( "y", seq_along(colsToSum) )

如果您想将其复制到一个新的data.table中,请按如下方式操作:
dt2 <- dt1[, lapply(.SD, sum, na.rm=TRUE), .SDcols=colsToSum]
setnames(dt2, summedNms)

如果你想将这些列追加到原始数据中:

dt1[, c(summedNms) := lapply(.SD, sum, na.rm=TRUE), .SDcols=colsToSum]

就一般的na.rm处理而言,data.table没有特定的处理方式,但可以查看?na.omit?na.exclude


2
对于没有na.rm选项的函数,您可以使用function(x) fun(na.omit(.SD)) - Dean MacGregor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接