Пересечение списков в R

есть ли функция, которая получает список x и возвращает список y такое, что y[[i]] = intersect(x[[1]][[i]], x[[2]][[i]], ...) ?

Если нет, есть ли способ R кодировать его в нескольких строках?

2 ответов


это работает?

x <- list(list(1:3,2:4),list(2:3,4:5),list(3:7,4:5))
maxlen <- max(sapply(x,length))
lapply(seq(maxlen),function(i) Reduce(intersect,lapply(x,"[[",i)))

(intersect принимает только два аргумента, поэтому вам нужно использовать Reduce в качестве дополнительного шага)

PS Я не пробовал это на каких-либо жестких случаях-например, списки неравномерной длины.


Кажется Reduce можно просто использовать следующим образом:

> Reduce(intersect,  list(v1 = c("a","b","c","d"), 
+                         v2 = c("a","b","e"), 
+                         v3 = c("a","f","g"))) 
[1] "a"