You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

旧人口普查数据条件索引优化:高效匹配家庭户主职业方案

高效统一家庭成员职业的解决方案

需求背景

处理旧人口普查数据时,需将家庭成员的职业统一为对应户主的职业。原方案通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 12:24:19