2014-11-24 56 views
0

我有一個多列表q這樣比較列表與多列表中的R

[[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)dq中的每個列表之間的術語數。 由於q的長度在100萬左右。什麼是有效的實施方式? 編輯:所需輸出應該是這樣的:

1 0 0 1 0 1 

由於只有一個dq[[1]]q[[4]]q[[6]]之間的輸出是1共同項目。

回答

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))