0Pricing
R Academy · 课时

使用 rank() 对值排名

使用平均、首次、最小、最大和随机等并列处理方法分配排名

使用 rank() 对值排名 是 CoddyKit 上的免费 R Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。

rank() 返回什么

rank(x) 返回向量中各值的样本排名。最小值的排名为 1,第二小值的排名为 2,依此类推。与 order() 不同,它的输出长度与输入相同,每个位置都存放该位置值的排名。

scores <- c(78, 92, 65, 88, 71)
ranks <- rank(scores)
print(scores)
print(ranks)

处理并列:平均排名法

当值相等(并列)时,rank() 使用 ties.method 参数决定如何分配排名。默认值是 'average':并列元素会获得它们原本所占排名的平均值。

x <- c(10, 20, 20, 30)
# Default: average of positions 2 and 3 = 2.5
rank(x)
rank(x, ties.method = 'average')

并列处理方法:first 和 last

ties.method = 'first' 会将较低的排名分配给向量中较早出现的并列元素。'last' 则相反——较早出现的元素会获得较高的排名。

x <- c(10, 20, 20, 30)
cat('first:', rank(x, ties.method = 'first'), '\n')
cat('last: ', rank(x, ties.method = 'last'),  '\n')

并列处理方法:min 和 max

'min' 会为所有并列元素分配它们可能获得的最小排名(体育比赛中,两名选手并列第 3 名时都排名第 3,没有人排名第 4)。'max' 则会为所有并列元素分配最大排名。

x <- c(10, 20, 20, 30)
cat('min:', rank(x, ties.method = 'min'), '\n')
cat('max:', rank(x, ties.method = 'max'), '\n')

并列处理方法:random

ties.method = 'random' 会在并列元素之间随机分配不同排名来打破并列。每次调用都可能产生不同结果。当您需要唯一的整数排名、但不关心并列的处理顺序时,这种方法很有用。

x <- c(10, 20, 20, 20, 30)
set.seed(42)
cat('random run 1:', rank(x, ties.method = 'random'), '\n')
set.seed(99)
cat('random run 2:', rank(x, ties.method = 'random'), '\n')

密集排名与标准排名

R 的 rank() 生成标准竞赛排名(1、2、2、4)。若要进行密集排名(1、2、2、3——排名之间没有间隔),可以对唯一值使用 rank(x, ties.method = 'min'),或者使用 data.table 或 dplyr 包。下面是一种基础 R 的解决方法:

x <- c(10, 20, 20, 30)
# Standard ranking (gaps after ties)
cat('Standard:', rank(x, ties.method = 'min'), '\n')
# Dense ranking: rank of sorted unique values
dense <- match(x, sort(unique(x)))
cat('Dense:   ', dense, '\n')

rank() 与 order() 及 sort()

这三个函数彼此相关,但返回的内容不同:sort(x) 返回排序后的值,order(x) 返回用于对向量排序的位置,而 rank(x) 返回每个位置的排名。下面进行并列比较。

x <- c(30, 10, 50, 20, 40)
cat('x       :', x,        '\n')
cat('sort(x) :', sort(x),  '\n')
cat('order(x):', order(x), '\n')
cat('rank(x) :', rank(x),  '\n')

按降序排名

要按从大到小的顺序排名(排名 1 = 数值最高),请先对向量取负,再将其传递给 rank()。排行榜通常使用这种模式,其中排名 1 表示最佳。

scores <- c(78, 92, 65, 88, 71)
desc_ranks <- rank(-scores)
cat('Scores:      ', scores,     '\n')
cat('Rank (best=1):', desc_ranks, '\n')

向数据框添加排名

一个常见任务是向数据框添加排名列。请将 rank() 与 ties.method = 'min' 搭配使用,并在降序排名时取负,以构建正确的排行榜。

df <- data.frame(
  player = c('Alice', 'Bob', 'Carol', 'Dave'),
  score  = c(250, 400, 250, 375)
)
df$rank <- rank(-df$score, ties.method = 'min')
df[order(df$rank), ]

包含 NA 值的 rank()

rank() 具有 na.last 参数,与 sort() 和 order() 一样。默认值是 'keep':为 NA 值分配 NA 排名,同时在非 NA 元素之间分别进行排名。

x <- c(5, NA, 2, NA, 8, 1)
cat('na.last=keep:  ', rank(x, na.last = 'keep'), '\n')
cat('na.last=TRUE:  ', rank(x, na.last = TRUE),   '\n')
cat('na.last=FALSE: ', rank(x, na.last = FALSE),  '\n')

百分位排名

将排名除以总数量,即可将排名转换为百分位。百分位排名表示小于或等于某个元素的值占全部值的比例。这在统计和教育评分中很有用。

scores <- c(60, 75, 82, 91, 68, 77, 85, 95)
n <- length(scores)
pct_rank <- rank(scores) / n * 100
result <- data.frame(score = scores, percentile = round(pct_rank, 1))
result[order(result$score), ]

快速检查

哪个 ties.method 会为所有并列元素分配相同的最低可能排名(类似体育比赛中两名选手并列第 3 名,因此没有人获得第 4 名)?

rank() 要点

rank() 的要点:

  • rank(x) 返回每个元素的排名(长度与输入相同)
  • 默认值 ties.method = 'average':并列元素共享其排名的平均值
  • 'min' = 体育比赛式排名(共享最低排名),'max' = 共享最高排名
  • 'first' 和 'last' 按出现顺序处理并列情况
  • 使用 rank(-x) 获取降序排名(排名 1 = 最大值)
  • 使用 df$rank <- rank(-df$score, ties.method='min') 向数据框添加排名列
x <- c(10, 30, 20, 30, 10)
cat('average:', rank(x, ties.method = 'average'), '\n')
cat('min:    ', rank(x, ties.method = 'min'),     '\n')
cat('max:    ', rank(x, ties.method = 'max'),     '\n')
cat('first:  ', rank(x, ties.method = 'first'),   '\n')

常见问题解答

「使用 rank() 对值排名」课时是免费的吗?

是的 — 「使用 rank() 对值排名」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。

「使用 rank() 对值排名」这节课中我会学到什么?

使用平均、首次、最小、最大和随机等并列处理方法分配排名 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 R Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 rank() 对值排名」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 R Academy 课中编写并运行代码吗?

能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 sort() 排序向量
  2. 使用 order() 灵活排序
  3. 使用 rank() 对值排名
  4. 按列排序数据框
← 返回 R Academy