繁体   English   中英

查找向量中的数字和字母

[英]Find numbers and letters in a vector

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

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)作为答案。

我们可以将搜索字符串转换为正则表达式,然后将每个字符串与目标向量进行匹配。 由于您需要匹配的搜索字符串数,因此我们可以计算目标向量中至少有一个匹配项的搜索字符串数。

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');

首先,我们提取v1所有数字并将其存储在l1然后提取所有alpha并将其存储在l2 然后,我们在将二者结合起来lst使用mapply()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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM