用另一个数据框不是合并引用的值替换/替换一个数据框中的所有值

问题描述

我有一个包含四个变量和品牌列表的数据框。我需要替换/替换引用另一个数据框中的值的品牌名称值。我创建的数据是虚构的,但希望能提供一个现实的例子来说明为什么我需要这样的东西。假设变量代表四个团队,而这些是团队工作的品牌。有时我们需要重命名一个品牌以使其与“ Brand X”失去联系。 这是团队和品牌的数据框

team_a <- c("Apple","IBM","HSBC","BA","Diageo","","")
team_b <- c("Microsoft","Google","Asus","Bethesda","Pernod","Diageo")
team_c <- c("Facebook","Samsung","BMW","P&G","Sony","")
team_d<- c("IBM","Apple","Microsoft","Facebook","McDonalds","")
df <- data.frame(team_a,team_b,team_c,team_d)

> df
  team_a    team_b   team_c    team_d
1  Apple Microsoft Facebook       IBM
2    IBM    Google  Samsung     Apple
3   HSBC      Asus      BMW Microsoft
4     BA  Bethesda   Google  Facebook
5 Diageo      HSBC      P&G      HSBC
6           Pernod     Sony McDonalds
7           Diageo     

这是参考数据框

Old_Name <- c("Apple","Google")
New_Name <- c("Brand X","Brand Y","Brand Z")
df2 <- data.frame(cbind(Old_Name,New_Name))

> df2
  Old_Name New_Name
1    Apple  Brand X
2 Facebook  Brand Y
3   Google  Brand Z

最终数据框应如下图所示

> df
   team_a    team_b  team_c    team_d
1 Brand X Microsoft Brand Y       IBM
2     IBM   Brand Z Samsung   Brand X
3    HSBC      Asus     BMW Microsoft
4      BA  Bethesda Brand Z   Brand Y
5  Diageo      HSBC     P&G      HSBC
6            Pernod    Sony McDonalds
7            Diageo  

当然,我可以为每个品牌手动这样做

df[df=="Apple"] <- "Brand X"

但是,将替换/替换功能与参考数据帧一起使用会更加有效。我一直运气不好。我见过的大多数示例都基于一个变量,因此人们一直在使用合并/替换路由。这涉及多个变量,我看不到使用合并的方法。如果有这样做的方法,将非常感谢您的帮助,或者如果您可以向我介绍正确的程序包/功能的方向,那也将是非常有用的。预先非常感谢。

解决方法

一个选择是从参考数据集('df2')创建命名向量(deframe),使用across在数据集('df')的列上循环,使用命名的向量以匹配并替换匹配的元素,而不匹配返回NA,然后使用NA

coalesce替换为原始列值
library(dplyr) # >= 1.0.0
library(tibble)
df %>% 
     mutate(across(everything(),~ coalesce(deframe(df2)[.],.)))
#   team_a    team_b  team_c    team_d
#1 Brand X Microsoft Brand Y       IBM
#2     IBM   Brand Z Samsung   Brand X
#3    HSBC      Asus     BMW Microsoft
#4      BA  Bethesda Brand Z   Brand Y
#5  Diageo      HSBC     P&G      HSBC
#6            Pernod    Sony McDonalds
#7            Diageo