我有一個包含 和 列的M1資料庫。這些 M 值對應于通過每種方法獲得的值。我現在的想法是為每個人創建一個排名列。對于和,排名將從最大值到最小值,反之。我制作了輸出表給你看。M2M3M1M2M3
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
輸出
> 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
調整排名:
我使用了代碼,但在我正在研究的情況下,我的排名如下所示:

uj5u.com熱心網友回復:
使用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
如果您的向量中有重復值,那么您必須選擇一種平局方法。默認情況下,您獲得平均排名,但您可以選擇“第一”。
我認為您想要做的另一種可能性是先轉換為因子,然后再轉換為數字,以便您僅獲得整個值(而不是平均值)。
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
uj5u.com熱心網友回復:
為了達到這個結果,我要做的是將每個 df 列轉換為因子,然后再次將它們轉換為數字。這可以在基本 R 中完成,但為簡單起見,我報告了 tidyverse 代碼:
library(tidyverse)
df1 = df1 %>%
mutate(Rank1 = as.numeric(as.factor(M1))) %>%
mutate(Rank2 = as.numeric(as.factor(M2))) %>%
mutate(Rank3 = as.numeric(fct_rev(as.factor(M3))))
uj5u.com熱心網友回復:
另一種可能的解決方案,基于dplyr:
library(dplyr)
df1 %>%
mutate(across(-3, ~ dense_rank(desc(.x)), .names = "{.col}_rank"),
across(3, ~ dense_rank(.x), .names = "{.col}_rank")) %>%
relocate(sort(names(.)))
#> 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/439406.html
上一篇:在范圍內選擇資料框中的列
