如何获得多个变量的连续排名
How to get consecutive rank for multiple variables
我有一个数据集,其中有 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
我得到了等级为 1 1 3 4 4 而不是 1 1 2 3 3 的 x 变量。对于 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
如果有人帮助我,我将不胜感激。
一个 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))))
好吧,一个简单的方法是先转换为 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
我们可以使用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
我有一个数据集,其中有 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
我得到了等级为 1 1 3 4 4 而不是 1 1 2 3 3 的 x 变量。对于 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
如果有人帮助我,我将不胜感激。
一个 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))))
好吧,一个简单的方法是先转换为 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
我们可以使用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