R语言按ID分组基于年份生成time_period时间期数变量方法
原有代码问题
- 分组逻辑错误:你将
year也加入了分组维度,此时每个分组只有1行记录,sequence(n())返回的结果全为1,无法实现同一id下按年份顺序编号的需求 - 变量名大小写不匹配:你数据中的分组字段为小写
id,代码中写为大写ID,R对变量名大小写敏感,会直接触发对象未找到的报错
tidyverse 实现方案
优先推荐dense_rank方案,无需提前排序,即使原始数据行顺序混乱也能得到正确结果,且同一id下同年份的记录会分配相同的期数:
library(tidyverse) # 构造示例数据 df <- structure(list(id = c(1, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4), year = c(2001, 2002, 2004, 2005, 2006, 2002, 2005, 2004, 2008, 2009, 2011)), class = "data.frame", row.names = c(NA, -11L)) # 生成时间期数 df_result <- df %>% group_by(id) %>% mutate(time_period = dense_rank(year)) %>% ungroup()
如果需要同一id下同年份的记录分配不同期数,可使用排序后加row_number的方案:
df_result <- df %>% group_by(id) %>% arrange(year, .by_group = TRUE) %>% mutate(time_period = row_number()) %>% ungroup()
基础R可选实现
# 效果和tidyverse的dense_rank方案一致 df$time_period <- ave(df$year, df$id, FUN = function(x) match(x, sort(unique(x))))
内容的提问来源于stack exchange,提问作者z_11122
相关产品推荐
相关产品推荐

