Кросс-табулирование общих элементов между несколькими векторами - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь и не могу получить количество элементов в пересечении между несколькими векторами одновременно в R: у меня есть несколько символьных векторов разной длины (уникальные элементы), и я хочу получить количество элементов, разделяемых между каждой парой векторов.

По сути, это означает что-то вроде length(intersect(a,b)), но повторяется несколько раз / как перекрестная таблица по всем комбинациям векторов.

Мне кажется, что это простой случай, связанный с чем-то вроде семьи apply(), но я не могу понять это ...: - /

Спасибо за любой совет !

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Чтобы получить пересечение всех комбинаций векторов, вы можете сделать:

l <- list(a1 = 1:5, a2 = 3:6, a3 = 4:9)

intsct_list <- combn(seq_along(l), 2, function(x) intersect(l[[x[1]]], l[[x[2]]]), simplify = FALSE)

names(intsct_list) <- combn(names(l), 2, paste0, collapse = "")

lengths(intsct_list)  

a1a2 a1a3 a2a3 
   3    2    3 
0 голосов
/ 11 марта 2020

Вы можете использовать Reduce; Вот минимальный воспроизводимый пример

a1 <- 1:5
a2 <- 3:6
a3 <- 4:9

Reduce(intersect, list(a1, a2, a3))
#[1] 4 5

Ключ должен хранить векторы в list.

...