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

时间:2020-08-18 19:11:56

标签: r dataframe replace substitution

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

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

1 个答案:

答案 0 :(得分:1)

一个选择是从参考数据集('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