使用data.table将数据框与NAs聚合在一起

dan*_*dan 1 aggregate r dataframe na data.table

我有一个大data.framecharacter列和几个包含NA's的数字列.

以下是一些示例行:

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)
Run Code Online (Sandbox Code Playgroud)

由于df$id重复我想aggregate df通过df$id,并适用sum于所有其它列.

我这样做了:

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

我得到这个:

   id v1 v2 v3 V4
1:  A  1  9  0  0
Run Code Online (Sandbox Code Playgroud)

所以列v3是所有NA's中df,并因此获得的价值0,这对我的问题,因为在这种情况下,我想保留NA的价值,但在所有其他情况下(其中聚集了数字和的混合NA的,显然我想删除NA'否则总和将是NA).如示例所示(df$v4)我有所有列0,因此我不能简单地用聚合替换所有的0's .NAdata.frame

换句话说,这是我期望的结果:

   id v1 v2 v3 V4
1:  A  1  9  NA 0
Run Code Online (Sandbox Code Playgroud)

知道如何实现这一目标data.table.SD聚合吗?

Erd*_*kas 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
Run Code Online (Sandbox Code Playgroud)