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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:40:27