Replace/Substitute 数据框中的所有值都引用了另一个数据框的值(不是合并)

Replace/Substitute ALL values in a dataframe with values referenced from another dataframe (not a merge)

我有一个包含四个变量和品牌列表的数据框。我需要 replace/substitute 品牌名称值引用来自另一个数据框的值。我创建的数据是虚构的,但希望能提供一个真实世界的例子来说明为什么我需要这样的东西。假设变量代表四个团队,这些是团队工作的品牌。有时我们需要将要匿名化的品牌重命名为“品牌 X”。 这是团队和品牌的数据框

team_a <- c("Apple", "IBM", "HSBC", "BA", "Diageo", "","")
team_b <- c("Microsoft", "Google", "Asus", "Bethesda", "HSBC", "Pernod", "Diageo")
team_c <- c("Facebook", "Samsung", "BMW", "Google", "P&G", "Sony", "")
team_d<- c("IBM", "Apple", "Microsoft", "Facebook", "HSBC", "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", "Facebook", "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"

然而,使用带有参考数据框的 replace/substitute 函数会更有效率。我一直在寻找运气不佳。我见过的大多数例子都是基于一个变量,所以人们一直在使用 merge/replace 路线。这是跨多个变量的,我看不到使用合并的方法。如果有一种方法可以做到这一点,我们将不胜感激,或者如果您能指出正确的 package/function 方向,那也很好。非常感谢。

一个选项是从参考数据集 ('df2') 创建一个命名向量 (deframe),用 [=12 遍历数据集 ('df') 的列=],使用命名向量匹配并替换它匹配的元素,而 non-match returns 为 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