2014-01-18 130 views
14

我有載體lis的名單,我需要因此,無論匹配到另一個向量vec匹配向量

lis <- list(c(2,0,0),c(1,1,0), c(1,0,1), c(0,2,0), c(0,1,1), c(0,0,2)) 
vec <- c(1,1,0) 

列表的向量,我會得到一個邏輯輸出

[1] FALSE TRUE FALSE FALSE FALSE FALSE 

或者只是在比賽的lis內的位置

我一直在沿着這些路線嘗試一些事情:

unlist(lis) %in% vec 

但問題是數字的位置是重要的,即區分c(1,1,0)c(1,0,1),這是我無法做到的。我想避免for循環,因爲這需要非常高效(快速)。

回答

6
sapply(lis,function(x)all(x==vec)) 
[1] FALSE TRUE FALSE FALSE FALSE FALSE 
8
sapply(lis, identical, vec) 
# [1] FALSE TRUE FALSE FALSE FALSE FALSE 

基準:

l1 <- list(1:1000)[rep(1, 10000)] 
v1 <- sample(1000) 
AG <- function() sapply(l1,function(x)all(x==v1)) 
J <- function() sapply(l1, identical, v1) 
microbenchmark(AG(), J()) 
# Unit: milliseconds 
# expr  min  lq median  uq  max neval 
# AG() 76.42732 84.26958 103.99233 111.62671 148.2824 100 
# J() 32.14965 37.54198 47.34538 50.93195 104.4036 100 
11

通過@agstudy和@Julius的答案涉及在(長)lis對象的環;這裏的假設的lis所有元素都相同的長度vec以允許未列出的參考

shortloop <- function(x, lst) 
    colSums(matrix(unlist(lst) == x, length(x))) == length(x) 

lis相比較長vec這是快速的向量比較的替代方案。

longloop <- function(x, lst) 
    sapply(lst, identical, x) 

l1 = rep(lis, 1000) 
microbenchmark(shortloop(vec, l1), longloop(vec, l1)) 
## Unit: microseconds 
##    expr  min   lq median   uq  max neval 
## shortloop(vec, l1) 793.009 808.2175 896.299 905.8795 1058.79 100 
## longloop(vec, l1) 18732.338 21649.0770 21797.646 22107.7805 24788.86 100 

有趣的是,使用for是不是從相比lapply隱含的循環性能的角度看壞(雖然比較複雜,容易出錯)

longfor <- function(x, lst) { 
    res <- logical(length(lst)) 
    for (i in seq_along(lst)) 
     res[[i]] = identical(x, lst[[i]]) 
    res 
} 
library(compiler) 
longforc = cmpfun(longfor) 
microbenchmark(longloop(vec, l1), longfor(vec, l1), longforc(vec, l1)) 
## Unit: milliseconds 
##    expr  min  lq median  uq  max neval 
## longloop(vec, l1) 18.92824 21.20457 21.71295 21.80009 23.23286 100 
## longfor(vec, l1) 23.64756 26.73481 27.43815 27.61699 28.33454 100 
## longforc(vec, l1) 17.40998 18.28686 20.47844 20.75303 21.49532 100 
+4

+1 - 你總要給偉大的答案,但在所有駕車的選舉人都這麼做的時候,經常沒有得到你應得的榮譽。創造性的解決方案。 –