我正在处理一组 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
... ... ... ... ...
我为每一列创建一个向量。
为此,我尝试使用 if
和 grep
函数进行 for
循环。
<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] ...
提前致谢!
最佳答案
您要查找每个列表之间的共同元素,而不仅仅是一般的重复项。下面的重复项是 Aaa、Ccc、Ddd 和 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
关于R找到超过2个向量的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52300416/