У меня есть два набора списков, и вам нужно проверить каждый вектор в первом списке относительно его соответствующего вектора во втором списке, чтобы увидеть, что отсутствует (меня интересует только то, что находится в первый список, который не во втором).Поиск отсутствующих значений между списками в R
Образец данных:
> x <- list(c(100,5,1), c(1,20,5))
> y <- list(c(1,2,5,10,20,50,100), c(1,20,50,100))
мне нужно как unlist и использовать setdiff(), поэтому я использую функцию сделать так:
> lapply(x, function(a,b) setdiff(unlist(a),unlist(b)), y)
Ожидаемый результат ничего для первого set и 5 для второго. К сожалению, это не набирает 5, что находится в x [2], но не находится в y [2]. Вместо этого, это мой результат:
[[1]]
numeric(0)
[[2]]
numeric(0)
Жутко, это, кажется, соответствие 5 до 50 (может быть?), Потому что если я изменю 5 х [2] к цифре как 3, что не в найдено в y [2], я получаю ожидаемый результат:
> x <- list(c(100,5,1), c(1,20,3))
> lapply(x, function(a,b) setdiff(unlist(a),unlist(b)), y)
[[1]]
numeric(0)
[[2]]
[1] 3
Любая идея, что происходит? Или есть лучший способ сделать это?
@ Даниэль дал мне хороший ответ, но мне все же хотелось бы, чтобы я понял, что происходит с setdiff в моих первоначальных попытках. – Frameworker247
Добавьте несколько операторов 'print' для отладки кода, и вы увидите, что он делает:' lapply (x, function (a, b) { \t print (paste0 ("a:", paste0 (unlist (a), collapse = ","))) \t print (paste0 ("b:", paste0 (unlist (b), collapse = ","))) \t setdiff (unlist (a), unlist (b)) }, y) ' – SymbolixAU