如何在 R 中一次构造多列
How to construct multiple columns at one time in R
下面是示例数据。我知道如何为每个时间段构建排名列,但这不是任务。我有一个更大的数据集,其中包含从 2001 年到 2022 年的月度数据,但希望避免手动执行此操作。有没有办法为一系列列构建排名列。在这种情况下,它将是 3 个新列。每个人都会将值从大到小排列。
area <- c("Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware")
sept2020 <- c(.120,.125,.130,.110,.095,.045,.131,.029)
oct2020 <- c(.121,.129,.128,.119,.099,.041,.138,.028)
nov2020 <- c(.119,.128,.129,.118,.091,.048,.139,.037)
percent <- data.frame(area,sept2020,oct2020,nov2020)
期望的结果会这样显示,但还有两个排名列.. 对于 oct2020 和 nov2020
area sept2020 rank1
Alabama .120 4
Alaska .125 3
Arizona .130 2
Arkansas .110 5
California .095 6
Colorado .045 7
Connecticut .131 1
Delaware .029 8
听起来您可能正在寻找 dplyr
中的 dense_rank 函数:
percent %>%
mutate(rank1 = dense_rank(desc(sept2020))
然后您可以简单地重复该代码,使用 dense_rank 中的 oct2020 和 nov2020 来创建接下来的两个排名变量。
1) dplyr 像这样使用 across
:
library(dplyr)
percent %>%
mutate(across(-1, ~ rank(desc(.)), .names = "{.col}_rank"))
给予:
area sept2020 oct2020 nov2020 sept2020_rank oct2020_rank nov2020_rank
1 Alabama 0.120 0.121 0.119 4 4 4
2 Alaska 0.125 0.129 0.128 3 2 3
3 Arizona 0.130 0.128 0.129 2 3 2
4 Arkansas 0.110 0.119 0.118 5 5 5
5 California 0.095 0.099 0.091 6 6 6
6 Colorado 0.045 0.041 0.048 7 7 7
7 Connecticut 0.131 0.138 0.139 1 1 1
8 Delaware 0.029 0.028 0.037 8 8 8
2) Base R Base R 解决方案如下。它给出了类似的输出。
Rank <- function(nm, x) rank(-x)
cbind(percent, mapply(Rank, paste0(names(percent)[-1], "_rank"), percent[-1]))
下面是示例数据。我知道如何为每个时间段构建排名列,但这不是任务。我有一个更大的数据集,其中包含从 2001 年到 2022 年的月度数据,但希望避免手动执行此操作。有没有办法为一系列列构建排名列。在这种情况下,它将是 3 个新列。每个人都会将值从大到小排列。
area <- c("Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware")
sept2020 <- c(.120,.125,.130,.110,.095,.045,.131,.029)
oct2020 <- c(.121,.129,.128,.119,.099,.041,.138,.028)
nov2020 <- c(.119,.128,.129,.118,.091,.048,.139,.037)
percent <- data.frame(area,sept2020,oct2020,nov2020)
期望的结果会这样显示,但还有两个排名列.. 对于 oct2020 和 nov2020
area sept2020 rank1
Alabama .120 4
Alaska .125 3
Arizona .130 2
Arkansas .110 5
California .095 6
Colorado .045 7
Connecticut .131 1
Delaware .029 8
听起来您可能正在寻找 dplyr
中的 dense_rank 函数:
percent %>%
mutate(rank1 = dense_rank(desc(sept2020))
然后您可以简单地重复该代码,使用 dense_rank 中的 oct2020 和 nov2020 来创建接下来的两个排名变量。
1) dplyr 像这样使用 across
:
library(dplyr)
percent %>%
mutate(across(-1, ~ rank(desc(.)), .names = "{.col}_rank"))
给予:
area sept2020 oct2020 nov2020 sept2020_rank oct2020_rank nov2020_rank
1 Alabama 0.120 0.121 0.119 4 4 4
2 Alaska 0.125 0.129 0.128 3 2 3
3 Arizona 0.130 0.128 0.129 2 3 2
4 Arkansas 0.110 0.119 0.118 5 5 5
5 California 0.095 0.099 0.091 6 6 6
6 Colorado 0.045 0.041 0.048 7 7 7
7 Connecticut 0.131 0.138 0.139 1 1 1
8 Delaware 0.029 0.028 0.037 8 8 8
2) Base R Base R 解决方案如下。它给出了类似的输出。
Rank <- function(nm, x) rank(-x)
cbind(percent, mapply(Rank, paste0(names(percent)[-1], "_rank"), percent[-1]))