2017-04-07 128 views
1

我有一個大的data.frame,其中有character列和幾個包含NA的數字列。使用data.table與NAs彙總數據幀

這裏有幾個例子行:

df <- data.frame(id=rep("A",3),v1=c(NA,1,NA),v2=c(2,5,2),v3=c(NA,NA,NA),V4=c(0,0,0),stringsAsFactors=F) 

由於df$id重複我想aggregatedfdf$id,並申請sum所有其他列。

我這樣做:

require(data.table) 
setDT(df)[,lapply(.SD, function(x) sum(x,na.rm=T)),by=.(id)] 

,並正在此:

id v1 v2 v3 V4 
1: A 1 9 0 0 

所以列v3df所有NA的,因此得到的0的值,這對一個問題因爲在這種情況下,我想保持NA的價值,但在所有其他情況下(其中聚合是通過混合數字和NA的,顯然我想刪除否則總和將爲NA)。如示例所示(df$v4),我的列全部爲0,因此我不能簡單地將0的全部替換爲的NA

換句話說,這是我想要的結果:

id v1 v2 v3 V4 
1: A 1 9 NA 0 

任何想法如何獲得data.table.SD聚集到實現這一目標?

+1

不是'data.table'問題:'總和(C(NA,NA,NA),na.rm = TRUE)'返回'0',因爲*「空集合的總和爲零,根據定義」。* – Cath

+2

編寫自己的函數mySum < - 函數(x)if(all(is.na(x)))NA else sum x,na.rm = TRUE)' – jogo

回答

5
df[,lapply(.SD, function(x) ifelse(all(is.na(x)),NA,sum(x,na.rm=T))),by=.(id)] 
id v1 v2 v3 V4 
1: A 1 9 NA 0 
1

我們也可以這樣做沒有if/else聲明

setDT(df)[, lapply(.SD, function(x) sum(x, na.rm = TRUE)*NA^all(is.na(x))), id] 
# id v1 v2 v3 V4 
#1: A 1 9 NA 0