我有一个像这样的多列表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
现在如何将d
与q
中的所有列表元素进行比较?
我需要这样的内容length(intersect(q,d))
应返回length(q)
列表。 d
与q
中每个列表之间的术语数量。
因为q
的长度大约是一百万。有效的实施方式是什么?
编辑:所需的输出应该是:
1 0 0 1 0 1
由于d
与q[[1]]
,q[[4]]
,q[[6]]
之间只有一个公共项目,因此输出为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))