web-dev-qa-db-ja.com

データフレームへのランキング列の追加

これは非常に一般的なタスクのようですが、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,]
9
user3614783

次のように、順序からランキングを計算できます。

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
11
josliber

試してください:

_## 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)と言った方がよいでしょう。

4
r2evans

Dplyrからarrangeとmutateを使用することもできます。

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

次を使用できます。

dat$Rank <-  rank(dat$score)
dat$Rank
1
Anshuman Kirty

あなたができること:

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