我有五个 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)
}
2条答案
按热度按时间ct2axkht1#
如果任务只是简单地移除数字,我们也可以使用
regex
来构造一个更简单的函数,这里使用tidyverse
:输出:
感谢@starja提供的数据。
g2ieeal72#
以下是使用
rename_with
的tidyverse
解决方案:由reprex package(v1.0.0)于2023年1月17日创建
基本上,
rename_function
首先创建一个 Dataframe ,其中每个旧/新变量名组合都在separate_rows
所在的行中,然后将其与可用的列名连接。当没有匹配时(例如,对于test
),连接将导致NA
,它将被coalesce
替换为原始名称。编辑
现在重复
separate_rows
步骤,将2个柱的结果堆叠在一起。