#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. Спасибо