我正在使用一组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] ...
先感谢您!
以下是根据您的解释编辑的答案,您希望找到至少两列之间的所有匹配项:
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)])
您要求在每个列表之间找到共同的元素,而不仅仅是重复。下面的重复是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个列表与第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
您可以使用data.table尝试一些有点复杂的东西:
library(data.table)
setDT(data)
data[, unlist(lapply(.SD, intersect, y = unique(A))), A][, .N, A][N == {ncol(dt) - 1}, A]