我怎样才能将一个 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_df
的 url
并更改 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)
我有一个类似这样的 "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_df
的 url
并更改 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)