2014-02-21 40 views
5

我有一個1000個名字的列表。 (說A) 我有5個名字的另一個列表。 (說B) 我想找出在1000號碼列表中出現5個名字的行號。如何匹配R中的所有匹配項?

例如。艾米可以在 出現25次,並有艾米B. 我想知道

我以前使用過的比賽的行艾米發生在A.,但只給每個5名的第一個分身在B中,這不符合我的目的。

我需要在R中完成。我對Regex一無所知。

謝謝!

+1

如果列A只是名稱,['match'](http://stat.ethz.ch/R-manual/R-devel/library/base /html/match.html)或'which(%B%)'將起作用。如果不是'grep'或者'grepl',但是'gregexp'是一個好人。但沒有數據就無法確定。如果你想一次一個地做B中的每個名字,那麼'lapply'會很有用。 –

回答

2
A <- sample(1:10, 100, 100) ## generate sample data 
B <- 1:5 

A %in% B 
[1] FALSE TRUE TRUE TRUE TRUE FALSE TRUE FALSE FALSE FALSE TRUE TRUE 
[13] FALSE TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE 
[25] FALSE FALSE TRUE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE 
[37] FALSE TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE TRUE FALSE FALSE 
[49] TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE FALSE FALSE FALSE FALSE 
[61] TRUE TRUE FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE TRUE FALSE 
[73] TRUE TRUE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE 
[85] TRUE TRUE TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE FALSE 
[97] FALSE FALSE FALSE TRUE 

which(A %in% B) 
[1] 2 3 4 5 7 11 12 14 16 17 20 21 22 23 24 27 28 30 31 
[20] 36 38 39 40 41 43 44 46 49 51 52 55 56 61 62 67 69 71 73 
[39] 74 79 85 86 87 88 91 93 94 95 100 


lapply(B, function(x) which(A %in% x)) 
[[1]] 
[1] 5 22 23 36 40 49 69 

[[2]] 
[1] 21 30 39 44 46 56 61 85 93 

[[3]] 
[1] 2 7 14 28 38 51 62 73 87 91 

[[4]] 
[1] 3 4 11 12 20 24 27 41 43 52 55 71 74 79 88 

[[5]] 
[1] 16 17 31 67 86 94 95 100 

沒有lapply,你不知道B的哪個元素在哪裏?

+1

,因爲它可以讓你看到哪個B項匹配A. – cianius

+0

你確定嗎? – cianius

+1

我明白了。我沒有意識到OP說「列表」。我認爲這是人物向量 – GSee

1

grr包含一個函數matches,這將讓你找到從A在B的所有元素的所有比賽,可以返回的結果爲兩列查找表或通過lapply(B, function(x) which(A %in% x))返回列表格式。但是,它的速度要快幾個數量級:

> A <- as.character(sample(1:1000, 1e5,TRUE)) ## generate sample data 
> B <- as.character(1:500) 
> microbenchmark::microbenchmark(result<-lapply(B, function(x) which(A %in% x)),result2<-grr::matches(B,A,list=TRUE,all.y=FALSE),times=10) 
Unit: milliseconds 
                 expr  min   lq  mean  median   uq  max neval 
      result <- lapply(B, function(x) which(A %in% x)) 1193.50104 1218.60509 1276.58727 1237.82048 1253.76487 1497.18798 10 
result2 <- grr::matches(B, A, list = TRUE, all.y = FALSE) 54.83836 56.28509 57.39188 57.79095 58.17673 59.46505 10