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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:54:03