2015-05-22 3 views
2

У меня есть 4 списковмножественное пересечение списков в R

a <- list(1,2,3,4) 
b <- list(5,6,7,8) 
c <- list(7,9,0) 
d <- list(12,14) 

Я хотел бы знать, какие из списков имеет общие элементы. В этом примере списки b и c имеют общий элемент 7.

Подход, основанный на грубой силе, заключался бы в том, чтобы взять каждую комбинацию списков и найти пересечение. Есть ли другой эффективный способ сделать это в R?

Другим подходом было бы сделать один список из всех списков и найти дубликаты. Тогда, возможно, у нас может быть функция отображения, указывающая, из каких исходных списков эти дубликаты. Но я не уверен, как это сделать. Я наткнулся на этот пост

Find indices of duplicated rows

Я думал, если мы могли бы изменить это, чтобы выяснить реальные списки, которые имеют дубликаты.

Я должен повторить этот процесс для многих групп списков. Любые предложения и идеи приветствуются! Заранее спасибо

+1

вы заинтересованы только, чтобы проверить, есть ли/есть значения в Commen или вы также хотите знать, какие значения в Commen ? – DatamineR

+0

@DatamineR Просто хочу знать, есть ли общие – Dinesh

+0

Взгляните на мое предложение – DatamineR

ответ

5

Как насчет использования этого двойного sapply?

l <- list(a,b,c,d) 

sapply(seq_len(length(l)), function(x) 
    sapply(seq_len(length(l)), function(y) length(intersect(unlist(l[x]), unlist(l[y]))))) 
    [,1] [,2] [,3] [,4] 
[1,] 4 0 0 0 
[2,] 0 4 1 0 
[3,] 0 1 3 0 
[4,] 0 0 0 2 

Толкование: напр. элемент [1,2] матрицы показывает, сколько элементов первый элемент списка l (в данном случае Подсписок a) имеет в Коммон с элементом второго списка (т.е. Подсписок b)

Или же просто чтобы увидеть показатели подсписков, которые имеют общее значение с некоторыми другими подсписка:

which(sapply(seq_len(length(l)), function(x) length(intersect(l[[x]], unlist(l[-x])))) >= 1) 
[1] 2 3 
+0

Спасибо за идею. У меня есть запрос. Если 'd <- list (8,14)', то списки 'b, c, d' имеют общие элементы. Я хотел бы получить вывод в виде списков 'b, c, d' или 1,2,3. Так что я должен искать матрицу и конкатенировать? – Dinesh

+0

Посмотрите на альтернативу – DatamineR

+0

, если 'd <- list (8,14)', то вторая альтернатива дает только 3,4 вместо 2,3,4. – Dinesh