2013-09-23 115 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選項的函數。 –