如何获得多个变量的连续排名

时间:2019-06-26 10:08:01

标签: r rank

我有一个数据集,其中有5个变体(var)和3个变量(x,y,z)可用。我需要为3个变量对这些品种进行排名。如果排名并列,则在开始下一排名之前会显示差距。我无法获得连续排名。这是我的数据

 x<-c(3,3,4,5,5)
 y<-c(5,6,4,4,5)
 z<-c(2,3,4,3,5)
 df<-cbind(x,y,z)
 rownames(df) <- paste0("G", 1:nrow(df))
 df <- data.frame(var = row.names(df), df)

我为结果尝试了以下代码

res <- sapply(df, rank,ties.method='min')
res

     var x y z
[1,]   1 1 3 1
[2,]   2 1 5 2
[3,]   3 3 1 4
[4,]   4 4 1 2
[5,]   5 4 3 5

我得到了x变量,其排名为1 1 3 4 4而不是1 1 2 33。对于y和z,发现了相同的结果。

我想要的结果是

 >res
     var x y z
[1,]   1 1 2 1
[2,]   2 1 3 2
[3,]   3 2 1 3
[4,]   4 3 1 2
[5,]   5 3 2 4

如果有人帮助我,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

一种dplyr可能是:

df %>%
 mutate_at(2:4, list(~ dense_rank(.)))

  var x y z
1  G1 1 2 1
2  G2 1 3 2
3  G3 2 1 3
4  G4 3 1 2
5  G5 3 2 4

或者base R的可能性:

df[2:4] <- lapply(df[2:4], function(x) match(x, sort(unique(x))))

答案 1 :(得分:2)

好吧,一种简单的方法是先转换为factor,然后再转换为integer

df[] <- lapply(df, function(x) as.integer(factor(x)))
df
#   var x y z
#G1   1 1 2 1
#G2   2 1 3 2
#G3   3 2 1 3
#G4   4 3 1 2
#G5   5 3 2 4

答案 2 :(得分:1)

我们可以使用data.table

library(data.table)
setDT(df)[, (2:4) := lapply(.SD, dense_rank), .SDcols = 2:4]
df
#   var x y z
#1:  G1 1 2 1
#2:  G2 1 3 2
#3:  G3 2 1 3
#4:  G4 3 1 2
#5:  G5 3 2 4