Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用data.table将data.frame与NAs聚合_R_Dataframe_Data.table_Aggregate_Na - Fatal编程技术网

使用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