使用 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 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 sort() 排序向量
- 使用 order() 灵活排序
- 使用 rank() 对值排名
- 按列排序数据框