我有1000个名字的清单。 (说A) 我有另外5个名字的清单。 (说B) 我想知道1000个数字列表中出现5个名称的行号。
例如。艾米可以在A中出现25次 B中有Amy。 我想知道Amy在A中出现了哪些行。
之前我曾经使用过匹配,但这只会给出B中5个名字中每个名字的第一次出现,而这些名字并不符合我的目的。
我需要在R中完成。我对Regex一无所知。
谢谢!
答案 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