5 r data-manipulation rank dataframe
M1我有一个包含列和M2的数据库M3。这些M值对应于通过每种方法获得的值。我现在的想法是为他们每个人制作一个排名列。对于M1和M2,排名将从最高值到最低值,M3反之亦然。我做了一个输出表给你看。
df1<-structure(list(M1 = c(400,300, 200, 50), M2 = c(500,200, 10, 100), M3 = c(420,330, 230, 51)), class = "data.frame", row.names = c(NA,-4L))
> df1
M1 M2 M3
1 400 500 420
2 300 200 330
3 200 10 230
4 50 100 51
Run Code Online (Sandbox Code Playgroud)
输出
> df1
M1 rank M2 rank M3 rank
1 400 1 500 1 420 4
2 300 2 200 2 330 3
3 200 3 10 4 230 2
4 50 4 100 3 51 1
Run Code Online (Sandbox Code Playgroud)
调整排名:
使用rank和relocate:
library(dplyr)
df1 %>%
mutate(across(M1:M2, ~ rank(-.x), .names = "{.col}_rank"),
M3_rank = rank(M3)) %>%
relocate(order(colnames(.)))
M1 M1_rank M2 M2_rank M3 M3_rank
1 400 1 500 1 420 4
2 300 2 200 2 330 3
3 200 3 10 4 230 2
4 50 4 100 3 51 1
Run Code Online (Sandbox Code Playgroud)
如果向量中有重复值,则必须选择一种关联方法。默认情况下,您会获得平均排名,但您可以选择“第一”。
另一种可能性,我认为你想要做的,就是转换为因子,然后转换为数字,这样你就只能得到整个值(而不是平均值)。
df1 <- data.frame(M1 = c(400,300, 50, 300))
df1 %>%
mutate(M1_rankAverage = rank(-M1),
M1_rankFirst = rank(-M1, ties.method = "first"),
M1_unique = as.numeric(as.factor(rank(-M1))))
M1 M1_rankAverage M1_rankFirst M1_unique
1 400 1.0 1 1
2 300 2.5 2 2
3 50 4.0 4 3
4 300 2.5 3 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1135 次 |
| 最近记录: |