R语言:多列汇总大型DataFrame时保留全NA分组行需求
问题
需要对大型DataFrame按c、d、e、f多列执行汇总操作,但该DataFrame中存在部分行的c、d、e、f列值全为NA,且这些行属于独立观测记录,需完整保留所有此类行。
示例输入DataFrame:
df <- data.frame(a = c(1,2,3,4,5,6), b = c(2,NA,2,1,NA,4), c = c(1,2,1,NA,NA,1), d = c(2,3,2,NA,NA,2), e = c(3,2,NA,NA,NA,NA), f = c(4,1,3,NA,NA,3))
期望输出:
df <- data.frame(a = c(1,2,3,4,5), b = c(2,NA,2,1,NA), c = c(1,2,1,NA,NA), d = c(2,3,2,NA,NA), e = c(3,2,NA,NA,NA), f = c(4,1,3,NA,NA))
解决方案
核心思路是将数据拆分为全NA行和非全NA行分别处理,再合并结果:
- 标记并分离出
c、d、e、f全为NA的行,这类行直接保留; - 对非全NA行按
c、d、e、f执行汇总操作(示例中为去重保留每组首行,可按需替换为求和、均值等逻辑); - 合并两类数据,恢复预期顺序。
以下是基于dplyr的实现代码:
library(dplyr) # 标记c/d/e/f全为NA的行 df <- df %>% mutate(all_na_cdef = ifelse(rowSums(!is.na(select(., c, d, e, f))) == 0, TRUE, FALSE)) # 分离并处理两类数据 all_na_rows <- df %>% filter(all_na_cdef) non_na_summarized <- df %>% filter(!all_na_cdef) %>% group_by(c, d, e, f) %>% slice(1) %>% # 此处为汇总逻辑,可替换为summarise(a_sum = sum(a), b_mean = mean(b, na.rm=TRUE))等 ungroup() # 合并结果并整理格式 result <- bind_rows(non_na_summarized, all_na_rows) %>% select(-all_na_cdef) %>% arrange(a) print(result)
执行后即可得到符合需求的结果:既完成了非全NA行的按列汇总,又完整保留了所有c、d、e、f全为NA的观测行。
内容的提问来源于stack exchange,提问作者Maya Eldar
相关产品推荐
相关产品推荐

