R 保持NA和x27;聚合后的s

R 保持NA和x27;聚合后的s,r,dataframe,data.table,aggregate,na,R,Dataframe,Data.table,Aggregate,Na,我有一个如下的数据框 test_df<-data.frame(col1=c(1,NA,NA,4,5),col2=c(3,NA,NA,5,6),col3=c("a","b","c","d","c")) test_df col1 col2 col3 1 3 a NA NA b NA NA c 4 5 d 5 6 c 听起来(根据您对澄清请求的评论)您希望聚合您的组,以便在缺少所有值的情况下得到NA,否则您需要

我有一个如下的数据框

test_df<-data.frame(col1=c(1,NA,NA,4,5),col2=c(3,NA,NA,5,6),col3=c("a","b","c","d","c"))
test_df
 col1 col2 col3
   1    3    a
   NA   NA   b
   NA   NA   c
   4    5    d
   5    6    c
听起来(根据您对澄清请求的评论)您希望聚合您的组,以便在缺少所有值的情况下得到
NA
,否则您需要非缺少值的总和。您可以传递具有以下行为的用户定义函数:

aggregate(list(test_df$col1,test_df$col2), by=list(test_df$col3),
          function(x) ifelse(all(is.na(x)), NA, sum(x, na.rm=T)))
#   Group.1 c.1..NA..NA..4..5. c.3..NA..NA..5..6.
# 1       a                  1                  3
# 2       b                 NA                 NA
# 3       c                  5                  6
# 4       d                  4                  5
库(data.table)
唯一(setDT(test_df)[,lappy(.SD,函数(x)
将(x,!all(is.na(x)),sum(x,na.rm=TRUE)),替换为=col3])
#col3 col1 col2
#1:a 13
#2:b NA
#3:C56
#4:D45

测试df1您想要什么输出?现在您正在使用
na.rm=T
忽略NAs。与
na相同。rm=F
您想要什么?我希望b的值为
na
,而不是
0
na.rm=F
不会聚合c的观察值,我想处理这两种情况,如果有多个观测值并且它们有
NA
输出应该是数值和,如果观测值只有
NA
,则应该保持
NA
。显示您在问题中期望的输出。谢谢josilber。。很好的方法:)我如何将它复制到数据中。
test_df[,list(sum(col1),sum(col2)),by=col3]
@ghub24我几乎可以用
test_dt[,lapply(.SD,function(x)ifelse(all(is.na(x)),NaN,sum(x,na.rm=T)),by=col3,.SDcols=c(“col1”,“col2”)]复制它。
,,但是如果我使用
NA
而不是
NaN
,它会给我带来错误。我对
data.table
软件包不太熟悉,如果您在如何使其与该软件包正常工作方面遇到问题,我建议您单独提出一个问题。@Arun感谢您提供了更好、更优雅的条件代码。@Arun我想代码中有一个bug。我正在更新我看到的代码。然后可以简化为
!全部(is.na(x))
Expected o/p
Col3 col1 col2
a    1    3
b    NA   NA
c    5    6
d    4    5
aggregate(list(test_df$col1,test_df$col2), by=list(test_df$col3),
          function(x) ifelse(all(is.na(x)), NA, sum(x, na.rm=T)))
#   Group.1 c.1..NA..NA..4..5. c.3..NA..NA..5..6.
# 1       a                  1                  3
# 2       b                 NA                 NA
# 3       c                  5                  6
# 4       d                  4                  5
 library(data.table)
 unique(setDT(test_df)[, lapply(.SD, function(x) 
                replace(x, !all(is.na(x)), sum(x, na.rm=TRUE))) , by=col3])

 #   col3 col1 col2
 #1:    a    1    3
 #2:    b   NA   NA
 #3:    c    5    6
 #4:    d    4    5

 test_df1 <- test_df
 test_df1$col2[2] <- 2
 unique(setDT(test_df1)[, lapply(.SD, function(x)
                replace(x, !all(is.na(x)), sum(x, na.rm=TRUE))) , by=col3])
 #  col3 col1 col2
 #1:    a    1    3
 #2:    b   NA    2
 #3:    c    5    6
 #4:    d    4    5
 test_df1$col2[5] <- NA
 setDT(test_df1)[, lapply(.SD, 
             function(x) sum(x,na.rm= !all(is.na(x)))), by=col3] 
 #   col3 col1 col2
 #1:    a    1    3
 #2:    b   NA    2
 #3:    c    5   NA
 #4:    d    4    5