2016-10-27 9 views
1

У меня есть два набора списков, и вам нужно проверить каждый вектор в первом списке относительно его соответствующего вектора во втором списке, чтобы увидеть, что отсутствует (меня интересует только то, что находится в первый список, который не во втором).Поиск отсутствующих значений между списками в 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 

Любая идея, что происходит? Или есть лучший способ сделать это?

+0

@ Даниэль дал мне хороший ответ, но мне все же хотелось бы, чтобы я понял, что происходит с setdiff в моих первоначальных попытках. – Frameworker247

+0

Добавьте несколько операторов '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

ответ

2

Как насчет этого?

lapply(seq_along(x), function(i) setdiff(x[[i]], y[[i]]))