将排名列添加到数据框

时间:2014-07-24 15:39:56

标签: r ranking

这似乎是一项非常常见的任务,但我无法在google或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,]

7 个答案:

答案 0 :(得分:10)

您可以按照以下顺序计算排名:

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

答案 1 :(得分:4)

尝试:

## 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

这显示基于$score的等级关系。如果您不想要$rank中的关联,那么您也可以说dat1$rank <- 1:nrow(dat1),因为它们已经处于有序状态。

答案 2 :(得分:1)

您可以使用:

dat$Rank <-  rank(dat$score)
dat$Rank

答案 3 :(得分:1)

你也可以使用dplyr中的arrange和mutate:

library(dplyr)
dat <- arrange(dat, desc(score)) %>%
          mutate(rank = 1:nrow(dat))
dat

答案 4 :(得分:0)

你可以这样做:

 dat$rank <- order(order.scores)
  dat$rank
 #[1] 5 3 4 8 7 6 1 2

答案 5 :(得分:0)

对于给定的数据帧 dat

  fname score
  Joe   500
  Bob   490
  Bill  500
  Tom   750
  Sue   550
  Sam   500
  Jane  210
  Ruby  320

我们也可以使用 dplyr 如下,它将 lowest 等级分配给 smallest 值,在本例中为 210

ranks = dat %>%
  mutate(ranks = order(order(score)))

输出如下:

fname score ranks
  Joe   500     4
  Bob   490     3
 Bill   500     5
  Tom   750     8
  Sue   550     7
  Sam   500     6
 Jane   210     1
 Ruby   320     2

如果需要反过来,即应该将 rank 1 分配给 highest 值,在这种情况下为 750,则代码将稍微更改如下:< /p>

ranks = dat %>%
  mutate(ranks = order(order(score, decreasing = T)))

这种情况下的输出如下:

fname score ranks
Joe   500     3
Bob   490     6
Bill  500     4
Tom   750     1
Sue   550     2
Sam   500     5
Jane  210     8
Ruby  320     7

答案 6 :(得分:0)

一般来说,Rank 可用于查找列数据的数值从最小到最大。

示例:Salary 是一列,它有 4 位数的薪水到 5 位数的薪水,然后在这里应用排名函数!

简单理解——工资在其中的排名。

df['Salary'].rank(ascending = False).astype(int)