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