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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:57:36