基于r中的另一个数据框更新多个数据框中的列



我有五个数据框架(df1, df2, df3, df4, df5),包括需要重命名的多个列。在作为重命名映射的单独数据框架中(参见下表),我有三列,一列包括新变量名,另外两列包括需要重命名的变量。旧变量1指的是df1、2和3,而旧变量2指的是df4和df5。

tbody> <<tr>
新变量 旧变量1 旧变量2
DPGDPG1, DPG2, DPG3DPG1, DPG2
LMNLMN1, LMN2, LMN3LMN1, LMN2
轻型导弹巡洋舰CLG1, CLG2, CLG3CLG1, 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_withtidyverse解决方案:

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步骤,将两列的结果叠加在一起。

相关内容

  • 没有找到相关文章