Заменить ВСЕ значения в фрейме данных значениями, на которые ссылаются из другого фрейма данных (не слияние)

#r #dataframe #replace #substitution

#r #фрейм данных #заменить #замена

Вопрос:

У меня есть фрейм данных с четырьмя переменными и списком брендов. Мне нужно заменить / подменить значения названия бренда, ссылающиеся на значения из другого фрейма данных. Созданные мной данные вымышлены, но, надеюсь, дают реальный пример того, зачем мне нужно что-то подобное. Допустим, переменные представляют четыре команды, и это бренды, над которыми работают команды. Иногда нам нужно переименовать бренд, чтобы он был анонимным, в «Бренд 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", "Pamp;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      Pamp;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     Pamp;G      HSBC
6            Pernod    Sony McDonalds
7            Diageo  
  

Конечно, я могу сделать это вручную для каждого бренда

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

Однако использование функции replace / substitute со ссылочным фреймом данных было бы намного эффективнее. Я искал без особой удачи. Большинство примеров, которые я видел, основаны на одной переменной, поэтому люди использовали маршрут слияния / замены. Это касается нескольких переменных, и я не вижу способа использовать слияние. Если есть способ сделать это, я был бы очень признателен за любую помощь, или если вы можете указать мне направление правильного пакета / функции, это тоже было бы здорово. Заранее большое спасибо.

Ответ №1:

Одним из вариантов является создание именованного вектора ( deframe ) из эталонного набора данных (‘df2’), перебор столбцов набора данных (‘df’) с помощью across , использование именованного вектора для сопоставления и замены элементов, которым он соответствует, в то время как несоответствие возвращается как 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     Pamp;G      HSBC
#6            Pernod    Sony McDonalds
#7            Diageo                  
  

Комментарии:

1. спасибо за объяснение этих шагов. Я пытался пойти по этому пути, но я не знал, как заменить NA на original. Спасибо