我有以下df:
id city uf home money work
34 LA RJ 10 2 2
33 BA TY 7 3 65
32 NY BN 4 5 4
12 SP SD 3 9 7
14 FR DE 1 8 9
17 BL DE 5 10 8
想要的 DF:
id city uf home rank_home money rank_money work rank_work
34 LA RJ 10 1 2 6 2 6
33 BA TY 7 2 3 5 65 1
32 NY BN 4 4 5 4 4 5
12 SP SD 3 5 9 2 7 4
14 FR DE 1 6 8 3 9 2
17 BL DE 5 3 10 1 8 3
我知道这是可能的:
dat$rank_home <- rank(dat$home)
但我想要一个更清晰的多列代码!
谢谢!!
最佳答案
我们可以循环 across
'home' 到 'work' 列,应用 rank
, 同时通过在 .names
中添加前缀来创建新列, 可能是 select
保持秩序
library(dplyr)
df1 <- df %>%
mutate(across(home:work, ~ rank(-.), .names = "rank_{.col}"))
或者可以在循环中执行此操作,通过指定 .after
将列放置在特定位置更灵活。或 .before
.请注意,我们使用复合赋值运算符(%<>%
来自 magrittr
)来进行原地赋值
library(magrittr)
library(stringr)
for(nm in names(df)[4:6]) df %<>%
mutate(!!str_c("rank_", nm) := rank(-.data[[nm]]), .after = all_of(nm))
-输出
df
id city uf home rank_home money rank_money work rank_work
1 34 LA RJ 10 1 2 6 2 6
2 33 BA TY 7 2 3 5 65 1
3 32 NY BN 4 4 5 4 4 5
4 12 SP SD 3 5 9 2 7 4
5 14 FR DE 1 6 8 3 9 2
6 17 BL DE 5 3 10 1 8 3
注意:如果列有关联,则默认使用方法是 "average"
.所以,ties.method
也可以是 rank
中的参数哪里有关系。
数据
df <- structure(list(id = c(34L, 33L, 32L, 12L, 14L, 17L), city = c("LA",
"BA", "NY", "SP", "FR", "BL"), uf = c("RJ", "TY", "BN", "SD",
"DE", "DE"), home = c(10L, 7L, 4L, 3L, 1L, 5L), money = c(2L,
3L, 5L, 9L, 8L, 10L), work = c(2L, 65L, 4L, 7L, 9L, 8L)),
class = "data.frame", row.names = c(NA,
-6L))
关于r - 在 R 中的数据框中添加多个排名列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68185316/