我怎样才能将一个 df 的列名与在另一个 df 中找到的值相匹配——如果找到,用更多的值重命名这些列?

How can I match the colnames of one df with the values found in another - and if found, rename those cols with further values?

我有一个类似这样的 "main_df",其中每个 colname 由一个唯一的 url 代码组成:

          main_df <- tibble("eW1BRoUDV4BKQMl" = c("word", "word", "word", "word", "word"),
                            "5zKTGwHlwlzpssB" = c("word", "word", "word", "word", "word"),
                            "55SVfoQudZJNCFT" = c("word", "word", "word", "word", "word"),
                            "bOORR1zuKYSnAe9" = c("word", "word", "word", "word", "word"),
                            "6RrOQfDZim81pHv" = c("word", "word", "word", "word", "word"))

# A tibble: 5 x 5
  eW1BRoUDV4BKQMl `5zKTGwHlwlzpssB` `55SVfoQudZJNCFT` bOORR1zuKYSnAe9 `6RrOQfDZim81pHv`
  <chr>           <chr>             <chr>             <chr>           <chr>            
1 word            word              word              word            word             
2 word            word              word              word            word             
3 word            word              word              word            word             
4 word            word              word              word            word             
5 word            word              word              word            word  

我还有第二个 "reference_df",它也包含相同的唯一 url,以及它们相应的合理 "item" 名称:

          reference_df <- tibble(item = c("ashtray", "bell", "blouse", "boot", "bottle"), 
                           url = c("eW1BRoUDV4BKQMl", "5zKTGwHlwlzpssB", "55SVfoQudZJNCFT", "bOORR1zuKYSnAe9", "6RrOQfDZim81pHv"))

# A tibble: 5 x 2
  item    url            
  <chr>   <chr>          
1 ashtray eW1BRoUDV4BKQMl
2 bell    5zKTGwHlwlzpssB
3 blouse  55SVfoQudZJNCFT
4 boot    bOORR1zuKYSnAe9
5 bottle  6RrOQfDZim81pHv

我需要将 "main_df" 的列名与 "reference_df$url" 中的值匹配,如果找到,将 "main_df" 的列名替换为 "reference_df$item"。因此,我的 "main_df" 的期望输出将是:

    # A tibble: 5 x 5
  ashtray bell  blouse boot  bottle
  <chr>   <chr> <chr>  <chr> <chr> 
1 word    word  word   word  word  
2 word    word  word   word  word  
3 word    word  word   word  word  
4 word    word  word   word  word  
5 word    word  word   word  word  

我可能可以使用 for 循环来完成此操作,但我想知道是否有解决方法。更可取的是 tidyverse 解决方案——我很确定我应该使用 apply 或 map_df(),但我就是想不通。

如有任何帮助,我们将不胜感激!

我们可以 match main_df 的列名称与 reference_dfurl 并更改 main_df 的名称。

names(main_df) <- reference_df$item[match(names(main_df), reference_df$url)]

# ashtray bell  blouse boot  bottle
#  <chr>   <chr> <chr>  <chr> <chr> 
#1 word    word  word   word  word  
#2 word    word  word   word  word  
#3 word    word  word   word  word  
#4 word    word  word   word  word  
#5 word    word  word   word  word  

dplyr 方法是根据 reference_df 中的 url 排列列并重命名。

library(dplyr)

main_df %>% select(reference_df$url) %>% rename_all(~reference_df$item)