2013-09-23 71 views
1

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

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

@rcs,并不完全是重复的,但类似 –

回答

4

首先,在使用该名称的对象变量:

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

+1

你可以使用'函数(x)fun(na.omit(.SD))'用于没有na.rm选项的函数。 –