Я думаю, что это следует сделать с пакетом data.table
.Это переупорядочить идентификаторы, это проблема?
# added seed
# changed col3 to col4
set.seed(1)
df1 <- data.frame(
num_var = sample(200, 15),
col1 = rep(c("onda","estrela","rato","caneta","ceu"), 3),
col2 = rep(c("muro","gato","pa","rato","ceu"), 3),
col3 = rep(c("surf","onda","dente","onda","sei"), 3),
col4 = rep(c("onda","casa",NA,"nao","net"), 3))
lookup_df <- data.frame(
lab_pt = c("onda","estrela","rato","caneta","ceu"),
lab_en = c("wave","star","rat","pen","sky"))
# data.table solution
library(data.table)
# change from wide to long, to make merge easier
dt <- melt(as.data.table(df1), id.vars="num_var")
# merge in the new values to original data
dt2 <- merge(dt, lookup_df, by.x="value", by.y="lab_pt",
all.x=TRUE)
# if its missing, replace with original value
dt2[is.na(lab_en), lab_en := value]
# convert back from long to wide
dt3 <- dcast(dt2[, .(num_var, variable, lab_en)], num_var~variable,
value.var="lab_en")
# back to data.frame
output <- as.data.frame(dt3)
Всякий раз, когда вы выполняете слияние между таблицами, обычно лучше работать с данными длинного формата, где у вас есть столбец группы и столбец значений.Это означает, что вам не нужно запускать одну и ту же операцию несколько раз (объединение).