如何在R中基于多列将家庭女性的宗教值填充至同户成员?
R中按家庭分组填充宗教信仰值的解决方案
你可以通过分组操作实现需求,比ifelse/case_when更高效简洁,以下是两种常用方法:
方法一:使用dplyr包(tidyverse生态,代码易读)
先加载dplyr,按家庭分组后提取组内非NA的宗教值,填充整个组的对应列:
library(dplyr) # 假设你的数据框名为df df_filled <- df %>% group_by(cluster_household) %>% # 提取组内唯一的非NA宗教值,填充所有成员 mutate(religion = first(na.omit(religion))) %>% ungroup()
补充说明:
group_by(cluster_household)按家庭分组na.omit(religion)去掉组内的NA值,剩下的就是该家庭女性的宗教值first()取这个非NA值(每个家庭只有一个有效值,first/last效果一致)ungroup()取消分组,恢复数据框结构
如果不确定非NA值在组内的位置,也可以用fill()函数双向填充:
df_filled <- df %>% group_by(cluster_household) %>% arrange(!is.na(religion), .by_group = TRUE) %>% # 把非NA值移到组首 fill(religion, .direction = "downup") %>% # 上下双向填充NA ungroup()
方法二:使用data.table包(适合大数据集,运行更快)
如果数据量较大,data.table的分组操作效率更高:
library(data.table) # 将数据框转为data.table格式 setDT(df) # 按家庭分组填充宗教值 df[, religion := first(na.omit(religion)), by = cluster_household]
为什么不推荐ifelse/case_when?
这两个函数是逐行判断逻辑,无法直接处理分组内的批量填充,代码冗余且效率低下,分组操作才是这类场景的最优解。
内容的提问来源于stack exchange,提问作者Azim
相关产品推荐
相关产品推荐

