使用 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
我有一个很大的 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