R语言求分组均值并保留全NA分组的实现求助
解决aggregate丢失全NA分组的问题
嘿,这个问题我之前也碰到过!aggregate()的默认行为就是会把分组内所有值都是NA的组别直接过滤掉,确实有点反直觉。下面给你两种可行的解决方案,都能帮你得到想要的new_df:
方法一:用dplyr包(语法更清晰,推荐)
dplyr的分组聚合默认会保留所有原始分组,哪怕分组里全是NA,处理起来很省心:
library(dplyr) new_df <- df %>% group_by(LETTER) %>% summarise(VALUE = mean(VALUE, na.rm = TRUE)) %>% # 把全NA分组计算出来的NaN转成NA mutate(VALUE = ifelse(is.nan(VALUE), NA, VALUE)) %>% ungroup()
运行这段代码后,你就能得到包含A、B、C三个组的结果,其中C组的VALUE会显示为NA,完全符合你的预期。
方法二:用base R的aggregate(不加载额外包)
如果你不想用dplyr,也可以给aggregate()加个参数,再处理一下结果:
# 先聚合,保留所有分组 temp_result <- aggregate(as.numeric(VALUE) ~ LETTER, df, mean, na.action = na.pass) # 把全NA分组得到的NaN替换成NA new_df <- transform(temp_result, VALUE = ifelse(is.nan(VALUE), NA, VALUE)) # 或者写成一个函数直接在aggregate里处理: new_df <- aggregate(as.numeric(VALUE) ~ LETTER, df, function(x) { avg <- mean(x, na.rm = TRUE) ifelse(is.nan(avg), NA, avg) }, na.action = na.pass)
这里的关键是na.action = na.pass——它告诉aggregate()不要剔除带NA的分组;然后我们把全NA分组计算出来的NaN转换成NA,就和你想要的结果一致了。
最后验证下结果:
print(new_df) # LETTER VALUE # 1 A 2.5 # 2 B 5.0 # 3 C NA
内容的提问来源于stack exchange,提问作者Remi
相关产品推荐
相关产品推荐

