我有一个由这些字符串组成的向量:
10I/V/F/R, 16E, 20R/M/T/I, 24I, 32I, 33F/I/V, 36I/L/V,45R, 46I/L/V, 48M/V, 53L,
54L/M/V, 60E, 63P, 71V/T/I,73C/S/T/A, 82A/F/I/S/T/M/L/C, 84A/C/V,85V, 88D/T/S, 89M/V/Q/T, 90M
我还有另外一个:
10F, 20M, 33F, 82A, 89Q, 93K
我想验证我的第二个向量的每个字符串是否存在于第一个向量中。在这个例子中,对于前五个是正确的,因为对于每个数字,存在关联的字母。我希望收到匹配的字符串数量,在本例中为5。
答案 0 :(得分:1)
我们可以将搜索字符串转换为正则表达式,然后将每个字符串与目标向量进行匹配。由于您需要匹配的搜索字符串数量,我们可以计算目标向量中有多少搜索字符串至少有一个匹配。
sum(lengths(lapply(sub('^([0-9]+)([a-zA-Z])$','^\\1.*\\2',b),grep,a))>0L);
## [1] 5
数据强>
a <- c('10I/V/F/R','16E','20R/M/T/I','24I','32I','33F/I/V','36I/L/V,45R','46I/L/V','48M/V',
'53L','54L/M/V','60E','63P','71V/T/I,73C/S/T/A','82A/F/I/S/T/M/L/C','84A/C/V,85V','88D/T/S',
'89M/V/Q/T','90M');
b <- c('10F','20M','33F','82A','89Q','93K');
答案 1 :(得分:1)
首先,我们提取v1
中的所有数字并将其存储在l1
中,然后我们提取所有字母并将其存储在l2
中。然后,我们使用lst
和mapply()
将这两者合并到paste0()
中。最后,我们循环v2
和sum()
grepl()
返回TRUE
的所有匹配
library(stringi)
l1 <- stri_extract_all_regex(v1, "[:digit:]+")
l2 <- stri_extract_all_regex(v1, "[:alpha:]")
lst <- mapply(function(x, y) paste0(x, y), l1, l2)
sum(sapply(v2, function(x) grepl(x, lst)))
给出了:
#[1] 5
数据强>
v1 <- c("10I/V/F/R", "16E", "20R/M/T/I", "24I", "32I", "33F/I/V",
"36I/L/V", "45R", "46I/L/V", "48M/V", "53L", "54L/M/V",
"60E", "63P", "71V/T/I", "73C/S/T/A", "82A/F/I/S/T/M/L/C",
"84A/C/V", "85V", "88D/T/S", "89M/V/Q/T", "90M")
v2 <- c("10F", "20M", "33F", "82A", "89Q", "93K");