基于R中另一个 Dataframe 中的行值更新多个 Dataframe 中的列名

8hhllhi2  于 2023-01-18  发布在  其他
关注(0)|答案(2)|浏览(134)

我有五个 Dataframe (df1,df2,df3,df4,df5)包括多个需要重命名的列。在单独的 Dataframe 中,该 Dataframe 用作重命名的Map(见下表),我有三列,一列包括新变量名,另外两列包括需要重命名的变量。旧变量1指df1,2和3,而old_variables2引用df4和df5。
| 新变量|旧变量1|旧变量2|
| - ------|- ------|- ------|
| 数据处理组|副检察长1、副检察长2、副检察长3|副秘书长1、副秘书长2|
| LMN|LMN1、LMN2、LMN3|LMN1、LMN2|
| CLG语言|CLG1、CLG2、CLG3|CLG1、CLG2|
我需要使用Map数据编写一个代码,根据Map数据中的New variables列重命名我的五个 Dataframe 中的列。例如,DPG1、LMN1和CLCG1属于df1,应将它们重命名为DPG、LMN、和clg。df2和df3也是一样。我尝试使用通用代码,因为信息可能会在我的数据文件中更新。有人能给我一些提示吗?我不知道如何处理旧变量列中每个单元格中用逗号分隔的多个值。
多亏了@starja,我想出了一个解决方案,但我仍然对函数的左连接部分有问题,因为通过= c("original_variables"="old_variables1","old_variables2")包含是错误的。

cols<- c(old_variables1, old_variables2)

rename_function <- function(col_names, rename_data = rename_info) {
for (col in cols) {
rename_info_clean <- separate_rows(rename_info,all_of(col))
}
data.frame(original_variables = col_names) %>% 
left_join(rename_info_clean , by = c("original_variables" = "old_variables1","old_variables2")) %>% 
mutate(final_name = coalesce(new_variables, original_variables)) %>% 
pull(final_name)
}
h43kikqp

h43kikqp1#

如果任务只是简单地移除数字,我们也可以使用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提供的数据。

mwngjboj

mwngjboj2#

以下是使用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

reprex package(v1.0.0)于2023年1月17日创建
基本上,rename_function首先创建一个 Dataframe ,其中每个旧/新变量名组合都在separate_rows所在的行中,然后将其与可用的列名连接。当没有匹配时(例如,对于test),连接将导致NA,它将被coalesce替换为原始名称。

编辑

现在重复separate_rows步骤,将2个柱的结果堆叠在一起。

相关问题