R: 多个字符列表之间的公共元素逐对提取

6
我可以帮您翻译成中文。以下是需要翻译的内容:

我有几个基因名称列表,如下所示:

列表1:

XLOC_012482 
XLOC_019357 
XLOC_014642 
XLOC_010021 
XLOC_013282 

列表2:

XLOC_012482 
XLOC_019357 
XLOC_004860 
XLOC_004022 
XLOC_002278 

列表3:

XLOC_004860 
XLOC_004022 
XLOC_006292 
XLOC_006616 
XLOC_013802 

我希望提取所有列表对之间的共同元素。我尝试使用intersect函数,但它不能用于字符类型,而且我也不知道如何在所有成对组合上执行此操作。


“intersect” 对我来说适用于字符。你可能正在使用因子变量。 - lmo
2
以上看起来不像是多个列表。你似乎有几个“字符”向量。如果所有这些向量都存储在一个“列表”对象中,您可以尝试使用combn(mylist,2,FUN=function(x) do.call(intersect,x),simplify=FALSE) - nicola
2个回答

4
你可以将你的列表放到一个单一的列表 `li` 中,然后使用`intersect`函数参数在该列表上使用`combn` :
combn(li, 2, function(x) intersect(x[[1]], x[[2]]), simplify = F)
# [[1]]
# [1] "XLOC_012482" "XLOC_019357"
# 
# [[2]]
# character(0)
# 
# [[3]]
# [1] "XLOC_004860" "XLOC_004022"

数据:

li <- list(c("XLOC_012482", "XLOC_019357", "XLOC_014642", "XLOC_010021", 
"XLOC_013282"), c("XLOC_012482", "XLOC_019357", "XLOC_004860", 
"XLOC_004022", "XLOC_002278"), c("XLOC_004860", "XLOC_004022", 
"XLOC_006292", "XLOC_006616", "XLOC_013802"))

1
这就是我在评论中建议的。+1。 - nicola
我将我的完整列表合并到mylist中,然后出现了以下错误:Error in combn(mylist, 2, function(x) intersect(x[[1]], x[[2]]), simplify = F) : n < m - Jon
你能否使用 dput 命令输出你的数据?即将 dput(mylist) 的结果粘贴过来? - Psidom
3
您的 mylist 比应该深了一层,而且它们是因子变量,这可能会引起问题。在进行如下转换后 mylist <- mylist[[1]]; mylist <- lapply(mylist, as.character),应该可以按预期工作。 - Psidom

1

这对于使用table也很有帮助(我使用与@Psidom的答案相同的li列表):

tb <- table(unlist(li))

将为您提供每个序列及其在所有列表中的计数:
# XLOC_002278 XLOC_004022 XLOC_004860 XLOC_006292 XLOC_006616 XLOC_010021 XLOC_012482 
#        1           2           2           1           1           1           2 
# XLOC_013282 XLOC_013802 XLOC_014642 XLOC_019357 
#          1           1           1           2 

如果你想提取那些重复的内容:
tb[tb>1]

# XLOC_004022 XLOC_004860 XLOC_012482 XLOC_019357 
#          2           2           2           2 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接