在R语言中基于Account与DATE列生成分组降序排名的方法
实现按Account分组的DATE降序排名
我来帮你搞定这个分组排名的问题!你之前用rank(Account, DATE)的写法不对,一是没按Account分组计算,二是rank()函数的参数用法搞错了——它不能直接把分组列和排序列这么传进去。下面几种方法都能实现你要的「按Account分组,DATE降序排名」的效果:
首先先确认你的示例数据:
df <- data.frame( Account = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3), DATE = c(201901, 201902, 201903, 201904, 201902, 201903, 201904, 201905, 201906, 201907, 201904, 201905) )
方法1:用dplyr分组+row_number()(最直观,适合无重复DATE的场景)
因为你的每个Account组内DATE都是唯一的,用row_number()可以直接生成连续的排名,配合desc()指定降序:
library(dplyr) df_rank <- df %>% group_by(Account) %>% # 按Account分组 mutate(RANK = row_number(desc(DATE))) %>% # 组内按DATE降序生成排名 ungroup() # 取消分组,回到普通数据框 print(df_rank)
运行后就能得到你期望的结果:
# A tibble: 12 × 3 Account DATE RANK <dbl> <dbl> <int> 1 1 201901 4 2 1 201902 3 3 1 201903 2 4 1 201904 1 5 2 201902 6 6 2 201903 5 7 2 201904 4 8 2 201905 3 9 2 201906 2 10 2 201907 1 11 3 201904 2 12 3 201905 1
方法2:用dplyr+rank()(处理有重复DATE的情况)
如果你的DATE列可能存在重复值,想要灵活处理并列排名,可以用rank()函数,通过ties.method参数控制重复值的排名规则:
df_rank <- df %>% group_by(Account) %>% mutate(RANK = rank(desc(DATE), ties.method = "first")) %>% # "first"表示重复值按出现顺序排,不并列 ungroup()
ties.method还有其他选项:比如"min"会给重复值相同的最小排名,"max"则是最大排名,根据你的需求选择即可。
方法3:Base R实现(无需额外包)
如果你不想用dplyr,用base R的ave()函数也能实现分组计算:
df$RANK <- ave(df$DATE, df$Account, FUN = function(x) rank(-x, ties.method = "first"))
这里用-x来实现降序排名,效果和上面的dplyr方法完全一致。
内容的提问来源于stack exchange,提问作者user13033450
相关产品推荐
相关产品推荐

