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

R语言按分组识别DataFrame中人员迁居回流模式的实现

R实现迁居回迁人员识别方案

核心逻辑

要判断人员是否存在迁出后迁回的情况,核心逻辑如下:

  1. 按人员分组后,先按年份升序排序,确保迁居时序正确
  2. 对每个人的居住地序列,去掉连续重复的居住地(排除长期定居未迁居的情况)
  3. 对比去重后序列长度和所有去过的不同居住地数量:如果序列长度>不同居住地数量,说明存在同一个地点非连续出现,即迁出后迁回

实现代码

依赖dplyr实现(更简洁易用)

首先构造示例数据:

library(dplyr)

# 构造示例DataFrame
df <- data.frame(
  person = c("Harry","Harry","Harry","Peter","Peter","Lily","Lily","Lily","Lily"),
  year = c(2002,2006,2007,2001,2002,2007,2008,2011,2013),
  location = c("Los Angeles","Boston","Los Angeles","New York","New York","New York","Boston","New York","Boston"),
  salary = c("$2000","$3000","$2500","$2000","$2300","$7000","$2300","$4000","$3300")
)

处理代码:

result <- df %>%
  group_by(person) %>%
  # 按年份排序保证时序正确
  arrange(year, .by_group = TRUE) %>%
  summarise(
    # 计算去掉连续重复居住地后的序列长度
    seq_len = length(rle(location)$values),
    # 计算所有去过的不同居住地数量
    distinct_loc = n_distinct(location),
    # 判定是否回迁,转成0/1格式
    move_back = as.integer(seq_len > distinct_loc)
  ) %>%
  # 保留需要的列
  select(person, move_back)

Base R实现(无需加载额外包)

# 先按人员+年份排序
df_sorted <- df[order(df$person, df$year), ]
# 按人员聚合计算回迁标识
result_base <- aggregate(
  location ~ person,
  df_sorted,
  function(x) as.integer(length(rle(x)$values) > length(unique(x)))
)
colnames(result_base) <- c("person", "move_back")

输出结果

两种方法输出的结果格式均和需求一致:

person move_back
1  Harry         1
2  Peter         0
3   Lily         1

内容的提问来源于stack exchange,提问作者RandomThinker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 08:45:05