У меня есть нечетный набор данных из ~ 50 строк x 200 столбцов, и я хотел бы перекодировать значения (строки) в определенных столбцах, используя другой фрейм данных, кодирующий преобразование из старых имен в новые имена. Я хотел бы сделать это в базовом R или dplyr, в идеале используя dplyr / tidyverse.
Есть около 70 уникальных значений для переключения, поэтому кодирование каждого изменения по отдельности будет слишком длинным (например, простой str_replace), и имеется около 70 столбцов, содержащих значения, которые я хочу изменить, поэтому непрактично кодировать что-либо, определяющее один именованный столбец за раз.
Столбцы, содержащие значения, которые я хочу изменить, встречаются в каждом третьем столбце, за исключением первого столбца индексации, и эти значения больше нигде в кадре данных не встречаются. Таким образом, решение типа mutate_all, которое ищет любую строку во фрейме данных, которая соответствует старым именам в фрейме данных преобразования, и заменяет их новыми именами, будет работать. Обратите внимание, что некоторые данные отсутствуют.
Примеры данных:
library("tidyverse")
# main dataset
col1 <- c("set1", "set2", "set3", "set4", "set5", "set6")
name_1 <- c("A", "D", "B", "A", "C", "A")
colour_1 <- c("red", "cyan", "red", "blue", "red", "blue")
shade_1 <- c("dark", "dark", "light", "light", "light", "light")
name_2 <- c("", "C", "D", "D", "", "A")
colour_2 <- c("", "red", "yellow", "blue", "", "purple")
shade_2 <- c("", "dark", "light", "dark", "", "light")
df_main <- data.frame(col1,name_1,colour_1,shade_1,name_2,colour_2,shade_2)
# The name_1 and name_2 columns are the ones I want changed, based on a conversion dataframe
# conversion dataframe
names_old <- c("A", "B", "C", "D", "E")
names_new <- c("1", "2", "3", "4", "5")
df_conversion <- data.frame(names_old,names_new)
# I want to base the switching from old names to new names in the main database using df_conversion
# Desired output
name_1_alt <- c("1", "4", "2", "1", "3", "1")
name_2_alt <- c("", "3", "4", "4", "", "1")
df_main_alt <- data.frame(col1,name_1_alt,colour_1,shade_1,name_2_alt,colour_2,shade_2)
Любая помощь очень ценится, спасибо.