旧人口普查数据条件索引优化:高效匹配家庭户主职业方案
高效统一家庭成员职业的解决方案
需求背景
处理旧人口普查数据时,需将家庭成员的职业统一为对应户主的职业。原方案通过Parish(教区编号)+House(房屋编号)组合为家庭唯一标识,再通过自定义函数匹配户主职业,但在大数据集上运行极慢。
测试数据集
test <- data.frame( RecID = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15), Parish = c(1,1,1,1,1,1,1,1,1,2,2,2,2,2,2), House = c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2), Relation = c("Head", "Wife", "Child", "Head", "Child", "Child", "Child", "Head", "Servant", "Head", "Child", "Child", "Head", "Child", "Servant"), Rela = c(1,2,3,1,3,3,3,1,4,1,3,3,1,3,4), Occode = c(1,2,5,2,1,3,4,4,4,1,1,3,2,4,1) )
原方案低效原因
原方案通过遍历每个唯一家庭标识,每次都对整个数据集进行过滤操作,属于循环式逐组处理,重复计算多,时间复杂度随数据集规模线性增长,大数据集下性能极差。
高效替代实现
方法1:使用dplyr分组向量化操作
直接按Parish和House分组,提取每组中户主(Rela == 1)的Occode作为该组所有成员的H_Occ,全程向量化运算,无需循环:
library(dplyr) test_optimized <- test %>% group_by(Parish, House) %>% mutate(H_Occ = Occode[Rela == 1]) %>% ungroup()
方法2:使用data.table(超大数据集首选)
data.table的分组操作性能更优,适合百万级以上的大数据集:
library(data.table) test_dt <- as.data.table(test) test_dt[, H_Occ := Occode[Rela == 1], by = .(Parish, House)]
效果说明
两种优化方案均避免了原方案中重复过滤数据集的开销,通过分组向量化运算大幅提升效率:
- 小数据集下速度提升数倍
- 大数据集(十万+行)下,速度可提升数十甚至上百倍
内容的提问来源于stack exchange,提问作者Mikhail
相关产品推荐
相关产品推荐

