我有五个数据框架(df1, df2, df3, df4, df5),包括需要重命名的多个列。在作为重命名映射的单独数据框架中(参见下表),我有三列,一列包括新变量名,另外两列包括需要重命名的变量。旧变量1指的是df1、2和3,而旧变量2指的是df4和df5。
新变量 | 旧变量1 | 旧变量2 | DPG | DPG1, DPG2, DPG3 | DPG1, DPG2 |
---|---|---|
LMN | LMN1, LMN2, LMN3 | LMN1, LMN2 |
轻型导弹巡洋舰 | CLG1, CLG2, CLG3 | CLG1, CLG2 |
如果任务只是删除数字,我们也可以使用一些regex
来制作更简单的函数。这里使用tidyverse
:
library(dplyr)
library(stringr)
test_data_1 |>
rename_with(~ str_extract(., "\D+"))
test_data_2 |>
rename_with(~ str_extract(., "\D+"))
输出:
DPG LMN test
1 1 4 a
DPG LMN other_name
1 2 5 4
感谢@starja提供的数据。
下面是使用rename_with
的tidyverse
解决方案:
library(dplyr)
rename_info <- data.frame(
new_variables = c("DPG", "LMN"),
old_variables = c("DPG1, DPG2, DPG3", "LMN1, LMN2, LMN3"),
old_variables_2 = c("DPG1, DPG2", "LMN1, LMN2")
)
test_data_1 <- data.frame(
DPG1 = 1,
LMN1 = 4,
test = "a"
)
test_data_2 <- data.frame(
DPG2 = 2,
LMN2 = 5,
other_name = 4
)
rename_function <- function(col_names, rename_data = rename_info) {
rename_info_clean_1 <- rename_info %>%
tidyr::separate_rows(
old_variables,
sep = ",[ ]+"
) %>%
select(new_variables, old_variables)
rename_info_clean_2 <- rename_info %>%
tidyr::separate_rows(
old_variables_2,
sep = ",[ ]+"
) %>%
select(new_variables, old_variables = old_variables_2)
rename_info_clean <- bind_rows(
rename_info_clean_1,
rename_info_clean_2
) %>%
distinct()
data.frame(original_variables = col_names) %>%
left_join(rename_info_clean, by = c("original_variables" = "old_variables")) %>%
mutate(final_name = coalesce(new_variables, original_variables)) %>%
pull(final_name)
}
test_data_1 %>%
rename_with(rename_function)
#> DPG LMN test
#> 1 1 4 a
test_data_2 %>%
rename_with(rename_function)
#> DPG LMN other_name
#> 1 2 5 4
在2023-01-17由reprex包(v1.0.0)创建
基本上,rename_function
首先创建一个data.frame,其中每个新旧变量名组合在separate_rows
的单独行中,然后它将其与可用的列名连接起来。当没有匹配时(例如,对于test
),连接将指向NA
,coalesce
将其替换为原始名称。
编辑
现在重复separate_rows
步骤,将两列的结果叠加在一起。