使用 data.table 将 data.frame 与 NA 聚合

Aggregating a data.frame with NAs using data.table

我有一个很大的 data.frame,其中有一个 character 列和几个包含 NA 的数字列。

以下是一些示例行:

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 重复我想 aggregate df df$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

所以第 v3 列是 df 中的所有 NA,因此得到 0 的值,这对我来说是个问题,因为在这种情况下我我想保留 NA 值,但在所有其他情况下(聚合是数字和 NA 的混合,显然我想删除 NA' s 否则总和将为 NA)。如示例所示 (df$v4) 我的列都是 0,因此我不能简单地将聚合 NA 中的所有 0 替换为 NA =16=].

换句话说,这是我想要的结果:

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

知道如何通过 data.table.SD 聚合来实现这一点吗?

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

我们也可以在没有 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