在R中,将一个向量与列表中的多个向量进行匹配

3

I have a list of vectors such as:

>list

[[1]]

[1] "a" "m" "l" "s" "t" "o"

[[2]]

[1] "a" "y" "o" "t" "e"

[[3]]

[1] "n" "a" "s" "i" "d"

我希望能够找到它们之间的匹配项,并与其余项进行比较(例如在第一个和其他两个之间,在第二个和其他两个之间,以此类推),并保留具有最高匹配数的一对。我可以使用“for”循环和成对相交来实现。例如:
for (i in 2:3) { intersect(list[[1]],list[[i]]) }

然后将输出保存到向量或其他数据结构中。然而,对于我来说,这似乎是非常低效的(因为我有数千个而不是3个),我想知道是否R有一些内置函数可以以聪明的方式完成这项任务。

问题是:

是否有一种方法可以查找一个向量与向量列表之间的匹配,而不需要显式使用“for”循环?


我的第一反应是寻找一个类似于 outer() 的函数,可以用于 list,然后执行类似于 outer(foo,foo,function(x,y)length(intersect(x,y))) 的操作,其中 foo 是你的 list。但是,你可能无法通过这种方式打败 for 循环:https://dev59.com/AHI-5IYBdhLWcg3wsKz9#1722565。 - Stephan Kolassa
2个回答

2

我不相信有内置的函数可以做到这一点。最好的尝试是像这样:

lsts <- lapply(1:5, function(x) sample(letters, 10)) # make some data (see below)
maxcomb <- which.max(apply(combs <- combn(length(lsts), 2), 2,
  function(ix) length(intersect(lsts[[ix[1]]], lsts[[ix[2]]]))))
lsts <- lsts[combs[, maxcomb]]
# [[1]]
#  [1] "m" "v" "x" "d" "a" "g" "r" "b" "s" "t"

# [[2]]
#  [1] "w" "v" "t" "i" "d" "p" "l" "e" "s" "x"

原始内容:

[[1]]
 [1] "z" "r" "j" "h" "e" "m" "w" "u" "q" "f"

[[2]]
 [1] "m" "v" "x" "d" "a" "g" "r" "b" "s" "t"

[[3]]
 [1] "w" "v" "t" "i" "d" "p" "l" "e" "s" "x"

[[4]]
 [1] "c" "o" "t" "j" "d" "g" "u" "k" "w" "h"

[[5]]
 [1] "f" "g" "q" "y" "d" "e" "n" "s" "w" "i"

这是一段非常棒的代码。之前我没有完全表达清楚。我想要保留列表中每个元素的最大匹配数。例如,对于你创建的列表(lsts)的第一个元素,最大匹配发生在列表的第一和第二个元素之间。现在,我正在尝试编写一个程序,对于第二个元素做同样的事情(即将第二个元素与所有其他元素进行比较,然后找到最大匹配),对于第三个元素也是如此,以此类推。也许可以通过子集矩阵来实现?无论如何,谢谢你,你的代码已经给了我很多工作上的启示。 - Javier
是的,基本上你想要做类似的事情并利用组合的对称性。试一试,如果你无法让它工作,请在今天晚些时候告诉我。 - Robert Krzyzanowski
我使用了expand.grid,然后对于每个元素进行子集,仅关注该元素与剩下元素的组合,排除元素本身。它起作用了!;) 谢谢! - Javier

1
datal <- list (a=c(2,2,1,2),
           b=c(2,2,2,4,3),
           c=c(1,2,3,4))

# all possible combinations
combs <- combn(length(datal), 2)
# split into list
combs <- split(combs, rep(1:ncol(combs), each = nrow(combs)))

# calculate length of intersection for every combination
intersections_length <- sapply(combs, function(y) {
  length(intersect(datal[[y[1]]],datal[[y[2]]]))
  }
  )

# What lists have biggest intersection
combs[which(intersections_length == max(intersections_length))]

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