将排名列添加到数据框

use*_*783 9 r ranking

这似乎是一个非常常见的任务,但我无法在谷歌或SO中找到解决方案.我想根据'order.scores'应用于'dat'的顺序,将一个名为'rank'的列添加到'dat1'.我尝试使用row.names(),但是rownames基于'dat',而不是'dat1'.我也试过'dat $ rank <-rank(dat1)',但这会产生错误信息.

fname<-c("Joe", "Bob", "Bill", "Tom", "Sue","Sam","Jane","Ruby")
score<-c(500, 490, 500, 750, 550, 500, 210, 320)
dat<-data.frame(fname,score)
order.scores<-order(dat$score,dat$fname)
dat1<-dat[order.scores,]
Run Code Online (Sandbox Code Playgroud)

jos*_*ber 11

您可以按如下方式计算排序的排名:

dat$rank <- NA
dat$rank[order.scores] <- 1:nrow(dat)
dat
#   fname score rank
# 1   Joe   500    5
# 2   Bob   490    3
# 3  Bill   500    4
# 4   Tom   750    8
# 5   Sue   550    7
# 6   Sam   500    6
# 7  Jane   210    1
# 8  Ruby   320    2
Run Code Online (Sandbox Code Playgroud)

  • @AugustinRiedinger 我使用了原始帖子中定义的`order.scores`,因此您需要从那里运行代码才能使我的代码正常工作。 (2认同)

r2e*_*ans 7

尝试:

## dat, dat1, and order.scores as defined
dat <- data.frame(fname=c("Joe", "Bob", "Bill", "Tom", "Sue","Sam","Jane","Ruby"),
                  score=c(500, 490, 500, 750, 550, 500, 210, 320))
order.scores <- order(dat$score)
dat1 <- dat[order.scores,]
dat1$rank <- rank(dat1$score)
dat1
##    fname score rank
##  7  Jane   210    1
##  8  Ruby   320    2
##  2   Bob   490    3
##  3  Bill   500    5
##  1   Joe   500    5
##  6   Sam   500    5
##  5   Sue   550    7
##  4   Tom   750    8
Run Code Online (Sandbox Code Playgroud)

这显示了基于 的排名关系$score。如果您不想在 中打领带$rank,那么您不妨说,dat1$rank <- 1:nrow(dat1)因为它们已经井井有条。


prm*_*lmu 5

您还可以使用 dplyr 中的排列和变异:

library(dplyr)
dat <- arrange(dat, desc(score)) %>%
          mutate(rank = 1:nrow(dat))
dat
Run Code Online (Sandbox Code Playgroud)