Вы также можете сделать это, используя два вложенных цикла for.Логика состоит в том, чтобы взять первую строку df2
, а затем начать проходить по строкам df1
, чтобы увидеть, соответствует ли df2$val1
df1$chk
, df2$val2
соответствует df1$chk2
и df2$val3
соответствует df1$chk3
.Я считаю, что все значения совпадают, если в каждом столбце есть хотя бы одно совпадение.Каверат здесь заключается в том, что если df2
не имеет уникальных строк, последняя соответствующая строка из df1
будет записана в df2
.Но это можно изменить, разорвав цикл, как только совпадение будет найдено.
for (i in 1:nrow(df2)) {
for (j in 1:nrow(df1)) {
# Take i-th row and split by ;. Result is a vector of strings against
# which we'll use match.
i.split <- strsplit(as.character(unlist(df1[j, , drop = TRUE][-4])), ";")
# Pairwise check columns from df1 and df2.
all.ok <- all(mapply(FUN = function(x, y) {
any(x %in% y)
}, x = i.split, y = as.list(df2[i, 1:3])
))
if (all.ok) {
# If a match is found, write the value to df2.
df2[i, "value"] <- df1[j, "value"]
}
}
}
Вывод:
val1 val2 val3 value
1 xx bb jj 1
2 xx dd kk 2
3 yy ee kk 2
4 zz hh jj NA