これは非常に一般的なタスクのようですが、GoogleやSOで解決策を見つけることができません。 'order.scores'が 'dat'に適用されるシーケンスに基づいて、 'rank'という列を 'dat1'に追加したいと思います。 row.names()を使用しようとしましたが、行名は「dat1」ではなく「dat」に基づいています。 '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,]
次のように、順序からランキングを計算できます。
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
試してください:
_## 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)
と言った方がよいでしょう。
Dplyrからarrangeとmutateを使用することもできます。
library(dplyr)
dat <- arrange(dat, desc(score)) %>%
mutate(rank = 1:nrow(dat))
dat
次を使用できます。
dat$Rank <- rank(dat$score)
dat$Rank
あなたができること:
dat$rank <- order(order.scores)
dat$rank
#[1] 5 3 4 8 7 6 1 2