R语言按分组识别DataFrame中人员迁居回流模式的实现
R实现迁居回迁人员识别方案
核心逻辑
要判断人员是否存在迁出后迁回的情况,核心逻辑如下:
- 按人员分组后,先按年份升序排序,确保迁居时序正确
- 对每个人的居住地序列,去掉连续重复的居住地(排除长期定居未迁居的情况)
- 对比去重后序列长度和所有去过的不同居住地数量:如果序列长度>不同居住地数量,说明存在同一个地点非连续出现,即迁出后迁回
实现代码
依赖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
相关产品推荐
相关产品推荐

