按R中数据框中的每一列计算排名
Calculate rank by each column in dataframe in R
我尝试按数据框的每一列生成排名(从最高到最低)。我有这个数据:
[,Cod] [,2] [,3] [,4]
[1,] A 100 300 200
[2,] B 200 200 100
[3,] C 300 100 300
我用这段代码来计算排名(只有一列):
df$rankCol2 <- (length(df$Col1)+1)-rank(df$Col2,ties.method = "last")
但我需要一个适用于多个列的解决方案。像这样:
[,Cod] [,2] [,3] [,4] [,RankCol2] [,RankCol3] [,RankCol4]
[1,] A 100 300 200 3 1 2
[2,] B 200 200 100 2 2 3
[3,] C 300 100 300 1 3 1
感谢
如果要按列对数据进行排名,可以使用apply
,因此:
数据:
df <- data.frame(
cod = c("A", "B", "C", "D", "E"),
v1 = c(100, 300, 400, 200, 700),
v2 = c(500, 600, 900, 100, 200),
v3 = c(300, 1000, 200, 400, 500))
解决方案:
df[paste0("v", 1:3, "rank")] <- apply(-df[,2:4], 2, rank)
结果:
df
cod v1 v2 v3 v1rank v2rank v3rank
1 A 100 500 300 5 3 4
2 B 300 600 1000 3 2 1
3 C 400 900 200 2 1 5
4 D 200 100 400 4 5 3
5 E 700 200 500 1 4 2
我尝试按数据框的每一列生成排名(从最高到最低)。我有这个数据:
[,Cod] [,2] [,3] [,4]
[1,] A 100 300 200
[2,] B 200 200 100
[3,] C 300 100 300
我用这段代码来计算排名(只有一列):
df$rankCol2 <- (length(df$Col1)+1)-rank(df$Col2,ties.method = "last")
但我需要一个适用于多个列的解决方案。像这样:
[,Cod] [,2] [,3] [,4] [,RankCol2] [,RankCol3] [,RankCol4]
[1,] A 100 300 200 3 1 2
[2,] B 200 200 100 2 2 3
[3,] C 300 100 300 1 3 1
感谢
如果要按列对数据进行排名,可以使用apply
,因此:
数据:
df <- data.frame(
cod = c("A", "B", "C", "D", "E"),
v1 = c(100, 300, 400, 200, 700),
v2 = c(500, 600, 900, 100, 200),
v3 = c(300, 1000, 200, 400, 500))
解决方案:
df[paste0("v", 1:3, "rank")] <- apply(-df[,2:4], 2, rank)
结果:
df
cod v1 v2 v3 v1rank v2rank v3rank
1 A 100 500 300 5 3 4
2 B 300 600 1000 3 2 1
3 C 400 900 200 2 1 5
4 D 200 100 400 4 5 3
5 E 700 200 500 1 4 2