如何在R中基于人员ID高效实现家庭分组(适配大数据集)
高效实现家庭分组(ID差值≤6归为同组)
需求说明
基于给定数据集,新增family_id列:
- ID差值不超过6的人员归为同一家庭
- 无符合条件同伴的人员,
family_id设为NA - 需适配3000+行的大数据量,保证计算效率
原始数据集
data <- data.frame(id_pers=c(4102,13102,27101,27102,28101,28102, 42101,42102,56102,73102,74103,103104,117103,117104,117105), birthyear=c(1992,1994,1993,1992,1995,1999,2000,2001,2000, 1994, 1999, 1978, 1986, 1998, 1999))
方法1:data.table(高效适配大数据)
data.table的向量化操作在处理大规模数据时性能更优,步骤如下:
library(data.table) # 转换为data.table并按ID排序(必须步骤,确保相邻ID可比较) setDT(data)[order(id_pers), ] # 计算相邻ID的差值,生成连续分组ID data[, diff_id := c(Inf, diff(id_pers))] data[, group := rleid(diff_id > 6)] # 过滤单成员组,将其family_id设为NA data[, group_size := .N, by = group] data[, family_id := ifelse(group_size > 1, group, NA)] # 清理临时辅助列 data[, c("diff_id", "group", "group_size") := NULL]
方法2:dplyr(语法直观,适合tidyverse用户)
如果熟悉tidyverse生态,用dplyr也能高效完成需求:
library(dplyr) data %>% arrange(id_pers) %>% # 计算相邻ID差,生成分组ID mutate( diff_id = c(Inf, diff(id_pers)), group = cumsum(diff_id > 6) ) %>% group_by(group) %>% # 仅保留多成员组的分组ID,单成员组设为NA mutate(family_id = ifelse(n() > 1, group, NA)) %>% ungroup() %>% # 移除临时列 select(-diff_id, -group)
结果验证
处理后数据集的family_id列会符合预期:
- 27101/27102、28101/28102等ID差值≤6的人员会被分到同一组
- 4102、13102等无匹配同伴的人员,
family_id为NA
内容的提问来源于stack exchange,提问作者Max Herre
相关产品推荐
相关产品推荐

