我有1000个名字的清单.(比如说A)我有另外一个包含5个名字的清单.(比如说B)我想找出1000个数字列表中出现5个名字的行号.
例如.Amy可以在A中出现25次而在B中有Amy.我想知道Amy在A中出现了哪些行.
我之前使用过匹配,但是只给出了B中5个名字中每个名字的第一次出现,这不符合我的目的.
我需要在R中做.我对Regex一无所知.
谢谢!
 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 中的哪个位置,是吗?
该包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