首页 > 解决方案 > 如何将一个 df 的 colnames 与另一个 df 中找到的值匹配 - 如果找到,用更多值重命名这些 cols?

问题描述

我有一个“main_df”,其中每个 colname 都包含一个 unqiue 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”,它也包含相同的唯一网址,以及它们相应的合理“项目”名称:

          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(),但我就是想不通。

任何帮助将非常感激!

标签: rreplacetidyversematching

解决方案


我们可以使用ofmatch的列名称并更改 的名称。main_dfurlreference_dfmain_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方法是根据urlinreference_df和重命名来排列列。

library(dplyr)

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

推荐阅读