如何为含无效值的分组填充前一组的可靠平均值?
高效解决方案
可以通过dplyr结合tidyr的向量化操作实现,避免循环,处理大数据集也高效:
library(dplyr) library(tidyr) # 构建原始数据框并预处理 DF <- data.frame(ID=c(seq(1,10, by = 1)), C1=c(9.1,0,9,9.2,9.1,0,0,9.3,9.1,9.0) , grp = c(1,2,2,3,4,5,5,5,6,7) ) %>% group_by(grp) %>% mutate( C1m = mean(C1), # 标记组是否可靠:组内无0值 is_reliable = all(C1 != 0) ) %>% ungroup() %>% # 仅保留可靠组的C1m,不可靠组设为NA mutate(reliable_C1m = ifelse(is_reliable, C1m, NA)) %>% # 向下填充NA,自动继承上一个可靠组的平均值 fill(reliable_C1m, .direction = "down") %>% # 重命名为目标变量C2 rename(C2 = reliable_C1m) %>% # 保留目标列 select(ID, C1, grp, C1m, C2)
逻辑说明
- 分组计算每组平均值
C1m,同时标记组是否可靠(用all(C1 != 0)判断组内无0值) - 仅给可靠组赋值
reliable_C1m,不可靠组设为NA - 使用
fill()向下填充NA,让不可靠组自动继承上一个可靠组的平均值 - 最后整理列顺序得到目标输出
运行后得到的结果完全符合你期望的输出格式。
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

