【发布时间】:2020-05-11 23:21:12
【问题描述】:
给定这个数据框:
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 作为 tie-breaker 即虽然 Anna 和 Christian 都得分 10,但 Anna 的排名 == 1 & Christian 的 == 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
我当前的输出发生了什么,如何获得我想要的输出?
编辑以在 age 和 scores 编码为整数而不是因子时显示输出
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
【问题讨论】:
-
请注意
cbind(names,scores, age)将所有内容强制转换为字符,然后data.frame(.)默认为stringsAsFactors = TRUE。现在分数被编码为最小的连续整数,10, not5! 从向量中创建 df 的正确方法是不使用 @ 987654331@。去掉它,你的结果就完全不同了。 -
在发布后注意到,但即使在调整后(使用
cbind.data.frame和as.int)排名也不合理 -
是的,我知道排名仍然是错误的。我想说的是你不需要
cbind,甚至不需要cbind.data.frame。方法是data.frame(names,scores, age)