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

如何在R语言数据框分组内按年份生成从0倒推的代际编号

解决你的DataFrame生成generation列问题

嘿,我来帮你搞定这个问题!你当前的代码之所以得到1-3的结果,是因为min_rank(year)是按年份升序计算排名的——最早的2016会拿到1,最新的2018拿到3,哪怕你先按desc(year)排了序,min_rank()的逻辑还是基于年份的实际数值,不是排序后的位置。

下面给你两种简单有效的修改方案:

方法一:利用组内最大年份直接计算(最直观)

这个思路最直接:generation本质就是当前年份和组内最新年份的差值,直接用year - max(year)就能得到目标结果,甚至不需要提前排序:

library(dplyr)

# 你的原始数据
df <- data.frame(group = c(rep("aaa", 3), rep("bbb", 3), rep("ccc", 3)), year = c(2016:2018))

# 生成目标列并按需求排序
df2 <- df %>%
  group_by(group) %>%
  mutate(generation = year - max(year)) %>%
  arrange(desc(year), group) # 可选步骤,匹配你想要的输出顺序

print(df2)

输出结果完全符合你的预期:

# A tibble: 9 × 3
# Groups:   group [3]
  group  year generation
  <chr> <int>       <int>
1 aaa    2018           0
2 bbb    2018           0
3 ccc    2018           0
4 aaa    2017          -1
5 bbb    2017          -1
6 ccc    2017          -1
7 aaa    2016          -2
8 bbb    2016          -2
9 ccc    2016          -2

方法二:修改你的排名逻辑

如果你想基于排名来实现,只需要调整min_rank的方向,再把排名转换成目标数值:

df2 <- df %>%
  group_by(group) %>%
  arrange(desc(year)) %>%
  mutate(generation = -(min_rank(desc(year)) - 1)) %>%
  arrange(desc(year), group) # 可选排序

print(df2)

这里min_rank(desc(year))会给最新的2018分配排名1,2017是2,2016是3;减去1后得到0、1、2,再取负数就正好是0、-1、-2,完美匹配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:30:43