R找到2个以上向量的匹配项

时间:2018-09-12 17:15:37

标签: r excel matching grepl

我正在使用一组由词A,B,C,D,E组成的5个excel列"Aaa","Aab"...,我想在所有列(R中)中找到完全匹配的项。

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

我为每一列创建一个向量。
为此,我尝试了一个forif函数的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中的单词)。
最后,我想在5列中有一个单词"Aaa", "Bbb"...匹配的向量。我不需要向量中每个匹配项的位置,只需要所有向量都通用的单词即可。

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

提前谢谢!

3 个答案:

答案 0 :(得分:0)

您要查找每个列表之间的公共元素,而不仅仅是通常的重复项。以下重复项是Aaa, Ccc, Ddd, and Xxx,但任何重复项中唯一的元素是Xxxintersect()将通过一些双重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个列表与第5个列表有1个共同点:

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

答案 1 :(得分:-1)

您可以使用data.table尝试一些复杂的事情:

library(data.table)

setDT(data)

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

答案 2 :(得分:-1)

以下是根据您要查找至少两列之间的所有匹配项的说明而编辑的答案:

 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)])