在向量中查找数字和字母

时间:2016-07-21 18:43:39

标签: regex r string

我有一个由这些字符串组成的向量:

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。

2 个答案:

答案 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中。然后,我们使用lstmapply()将这两者合并到paste0()中。最后,我们循环v2sum() 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");