Во-первых, работа с combinations
в качестве вложенного списка усложнит ситуацию. Лучше, если это возможно, иметь аккуратный data.frame:
comb <- data.frame(name = c('hydraulics','hydraulics','cience','data_science'),
cod = c(81017, 81017, 81016, 81015),
exp = c("ICH2304", "IMM2003", "ICH2304", "IIC1005"))
comb
name cod exp
1 hydraulics 81017 ICH2304
2 hydraulics 81017 IMM2003
3 cience 81016 ICH2304
4 data_science 81015 IIC1005
Теперь мы можем циклически проходить по вашим exp_data
по строкам и сопоставлять значения course
и curr_code
со значениями в comb
. which
вернет номер строки, в которой найдено это значение. Взяв intersect
из них, вы получите вектор с индексом строки, где оба соответствуют course
и curr_code
. Если совпадений нет, вы получите пустой вектор.
Поскольку мы ищем строки без совпадений, мы можем просто проверить, является ли length
этого вектора == 0
, чтобы получить логический вектор, сообщающий, какие строки exp_data
не имеют совпадающих строк в comb
, Мы можем просто использовать этот вектор для подстановки exp_data
, используя квадратные скобки, чтобы получить желаемый результат.
rows_no_match <- apply(exp_data, 1, function(x) {
length(intersect(which(x[['course']] == comb$exp),
which(x[['curr_code']] == comb$cod))) == 0
})
exp_data[rows_no_match,]
id curr_code course
3 3 81017 IIC1005
5 5 81015 ICH2304
7 7 81015 IBM1005