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