将列表与R中的多列表进行比较

时间:2014-11-24 03:01:11

标签: r list

我有一个像这样的多列表q

[[1]]
[1]   1   2   3   4   5   6  10  12  15  20  32  49  57  74 100

[[2]]
[1]  1  2  3 13 27

[[3]]
[1]  4 21 73

[[4]]
[1]  1  2  3  4 11 25 28 42

[[5]]
[1]  1  2  3  4 26

[[6]]
[1]  1  2  3 11

我还有另一个列表d

[1]  5 11 14 18 38 61

现在如何将dq中的所有列表元素进行比较? 我需要这样的内容length(intersect(q,d))应返回length(q)列表。 dq中每个列表之间的术语数量。 因为q的长度大约是一百万。有效的实施方式是什么? 编辑:所需的输出应该是:

1 0 0 1 0 1

由于dq[[1]]q[[4]]q[[6]]之间只有一个公共项目,因此输出为1

1 个答案:

答案 0 :(得分:1)

您可以使用vapply

vapply(q, function(x) length(intersect(x, d)), 1L)
# [1] 1 0 0 1 0 1

不确定,但执行起来可能会更快

vapply(q, function(x) sum(x %in% d), 1L)
# [1] 1 0 0 1 0 1

......事实证明,使用sum(x %in% d)

要快得多
qq <- rep(q, 1e4)
length(qq)
# [1] 60000

f <- function() vapply(qq, function(x) length(intersect(x, d)), 1L)
g <- function() vapply(qq, function(x) sum(x %in% d), 1L)

library(microbenchmark)
microbenchmark(f(), g(), times = 10, unit = "relative")
# Unit: relative
#  expr    min       lq     mean   median       uq      max neval cld
#   f() 8.4694 8.466754 8.311812 8.557292 8.447665 7.095008    10   b
#   g() 1.0000 1.000000 1.000000 1.000000 1.000000 1.000000    10  a 


identical(f(), g())
# [1] TRUE

原始q列表在哪里

q <- list(c(1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 32, 49, 57, 74, 100), 
          c(1, 2, 3, 13, 27), c(4, 21, 73), c(1, 2, 3, 4, 11, 25, 28, 42),  
          c(1, 2, 3, 4, 26), c(1, 2, 3, 11))
相关问题