了解 R 中 "order" 函数的输出

understanding output of "order" function in R

给定这个数据框:

names <- c("Anna", "Bella", "Christian", "Derrick", "Emma")
scores <- c(10,5,10,9,8)
age <- c(16,16,17,18,21)
test <- data.frame(cbind(names,scores, age))

我希望创建一个按 scores 排名并使用 names 作为决胜局的变量 即虽然安娜和克里斯蒂安都得分为 10,但安娜的排名 == 1 & 克里斯蒂安的 == 2

我的代码:test$rank_by_score <- order(test$scores, test$names, decreasing = T)

当前输出:

names      scores   age   rank_by_score
Anna       10       16    4
Bella      5        16    5
Christian  10       17    2
Derrick    9        18    3
Emma       8        21    1

期望的输出:

names      scores   age   rank_by_score
Anna       10       16    1
Bella      5        16    5
Christian  10       17    2
Derrick    9        18    3
Emma       8        21    4

我当前的输出发生了什么,我如何获得我想要的输出?

编辑以显示 agescores 被编码为整数而不是因数 时的输出

names      scores   age   rank_by_score
Anna       10       16    3
Bella      5        16    1
Christian  10       17    4
Derrick    9        18    5
Emma       8        21    2

我认为您正在寻找 rank 而不是 order,但是 rank 只能取一列值。所以我们可以先order基于names的数据,然后使用rank.

test <- test[order(test$names), ]

rank(-test$scores, ties.method = "first")
#[1] 1 5 2 3 4

请参阅 ?rank 了解不同的 ties.method 选项。如果我们在出现平局时使用 ties.method = "first",则在 ties.method = "last".

时,将给第一个出现的条目和相反的条目分配小数字
rank(-test$scores, ties.method = "last")
#[1] 2 5 1 3 4

order returns 排序后的原始向量索引。

a1 <- order(test$scores, decreasing = TRUE)
a1
#[1] 1 3 4 5 2

a2 <- test$scores
a2
#[1] 10  5 10  9  8

这里,order的输出可以解释为a2[a1[1]](10)是最大的数,其次是a2[a1[2]](10)和a2[a1[3]](9)等等。

数据

names <- c("Anna", "Bella", "Christian", "Derrick", "Emma")
scores <- c(10,5,10,9,8)
age <- c(16,16,17,18,21)
test <- data.frame(names, scores, age)