如何在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
相关产品推荐
相关产品推荐

