使用data.table将data.frame与NAs聚合
我有一个大的使用data.table将data.frame与NAs聚合,r,dataframe,data.table,aggregate,na,R,Dataframe,Data.table,Aggregate,Na,我有一个大的数据框,有一个字符列和几个包含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) 我明白了: id v1 v2 v3 V4 1: A 1 9 0 0 因此,v3列在df中都是NA,因此得到的值为0,这给我带来了一个问题,因为在这种情况下,我希望保留NA值,但在所有其他情况
数据框
,有一个字符
列和几个包含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)
我明白了:
id v1 v2 v3 V4
1: A 1 9 0 0
因此,v3
列在df
中都是NA
,因此得到的值为0
,这给我带来了一个问题,因为在这种情况下,我希望保留NA
值,但在所有其他情况下都是如此(如果聚合是数值和NA
的混合,显然我想删除NA
,否则总和将是NA
)。如示例所示(df$v4
)我的列都是0
,因此我不能简单地用聚合的数据中的NA
替换所有0
换句话说,这是我想要的结果:
id v1 v2 v3 V4
1: A 1 9 NA 0
知道如何获取数据.table
的.SD
聚合来实现这一点吗?我们也可以不用if/else
语句来实现这一点
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
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
我们也可以在不使用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
不是一个数据。表问题:sum(c(NA,NA,NA),NA.rm=TRUE)
返回0
,因为“根据定义,一个空集的和为零”。编写自己的函数mySum不是数据。表问题:sum(c(NA,NA,NA),NA.rm=TRUE)
返回0
因为“根据定义,空集的和为零。”编写自己的函数mySum