如何匹配R中的所有实例?

时间:2014-02-21 23:13:58

标签: regex r list

我有1000个名字的清单。 (说A) 我有另外5个名字的清单。 (说B) 我想知道1000个数字列表中出现5个名称的行号。

例如。艾米可以在A中出现25次 B中有Amy。 我想知道Amy在A中出现了哪些行。

之前我曾经使用过匹配,但这只会给出B中5个名字中每个名字的第一次出现,而这些名字并不符合我的目的。

我需要在R中完成。我对Regex一无所知。

谢谢!

2 个答案:

答案 0 :(得分:3)

 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中哪个元素是A在哪里?

答案 1 :(得分:3)

grr包含一个函数matches,它允许您查找B中A的所有元素的所有匹配。它可以将结果作为两列查找表或列表格式返回由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