R найти совпадения для более чем 2 векторов - PullRequest
0 голосов
/ 12 сентября 2018

Я работаю с набором из 5 столбцов Excel A,B,C,D,E слов "Aaa","Aab"... и хочу найти точные совпадения во всех столбцах (в R).

A   B   C   D   E  
Aaa Aaa Baa Aaa Ass
Aab Ccc Aaa Baa Aaa
Ccc Abc Ccc Ccc Ccc
... ... ... ... ... 

Я создаю вектор для каждого столбца.
Для этого я пробую цикл for с функциями if и grep.

<pre>
    for(i in A_vector) {
          if(grep("i", B_vector))
              if(grep("i", C_vector))
                  if(grep("i", D_vector))
                      if(grep("i", E_vector))
                          print(i)
      }
<code>

(но я получаю слова только в первом векторе A_vector).
В конце я хотел бы получить вектор со словами "Aaa", "Bbb"..., которые совпадают в 5 столбцах,Мне не нужна позиция каждого совпадения в векторе, только слова, которые являются общими для всех векторов.

 Result
    [1] "Aaa"
    [2] "Ccc"
    [n]  ...

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

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

 Mylist <-list(A=c("Aaa","Aab","Ccc","Ddd"), B=c("Aaa","Ccc","Abc","Abd"), C=c("Baa","Aaa","Ccc","Abb","Ddd"), D=c("Aaa","Baa","Ccc","CBB","Baa"),E=c("Ass","Aaa","Ccc","Gef"))
 CharVec <-unlist(Mylist)
 unique(CharVec[duplicated(CharVec)])
0 голосов
/ 18 сентября 2018

Вы просите найти общие элементы в каждом списке, а не просто дубликаты в целом.Дубликаты ниже Aaa, Ccc, Ddd, and Xxx, но единственный элемент, дублированный на любой из них, Xxx.intersect() выполнит это с некоторыми двойными lapply функциями.

A = list("Aaa", "Aaa", "Ccc", "Ccc")
B = list("Ddd", "Ddd", "Ddd", "Eee")
C = list("Fff", "Ggg", "Hhh", "Iii", "Jjj")
D = list("Kkk", "Lll", "Mmm", "Nnn", "Xxx")
E = list("Ppp", "Qqq", "Rrr", "Xxx")
Mylist <- list(A, B, C, D, E)

dupes <- unlist(lapply(Mylist, function(x) lapply(Mylist, function(y) intersect(x,y))))

unique(dupes[duplicated(dupes)])

[1] "Xxx"

Чтобы увидеть, где находятся пересечения, это скажет вам, что у вашего 4-го списка есть 1 общий элемент с вашим 5-м списком:

sapply(seq_len(length(Mylist)), function(x) sapply(seq_len(length(Mylist)), function(y) length(intersect(unlist(Mylist[x]), unlist(Mylist[y])))))

     [,1] [,2] [,3] [,4] [,5]
[1,]    2    0    0    0    0
[2,]    0    2    0    0    0
[3,]    0    0    5    0    0
[4,]    0    0    0    5    1
[5,]    0    0    0    1    4
0 голосов
/ 12 сентября 2018

Вы можете попробовать что-нибудь, хоть и немного запутанное, используя data.table:

library(data.table)

setDT(data)

data[, unlist(lapply(.SD, intersect, y = unique(A))), A][, .N, A][N == {ncol(dt) - 1}, A]
...