我有一个角色向量
c1 <- c("BEL","BEL","BEL","BEL")
和另一个长度相同的字符向量
c2 <- c(" BEL-65_DRe-I_1p:BEL;_LTR_Retrotransposon;_Transposable_Element;_Nonautonomous;_BEL-65_DRe-I", "L1-2_NN_3p:L1;_Non-LTR_Retrotransposon;_Transposable_Element;_L1-2_NN", "BEL-13_CQ-I_1p:BEL;_LTR_Retrotransposon;_Transposable_Element;_BEL-13_CQ_;_BEL-13_CQ-LTR;_BEL-13_CQ-I", "BEL-31_CQ-I_1p:BEL;_LTR_Retrotransposon;_Transposable_Element;_BEL-31_CQ_;_BEL-31_CQ-LTR;_BEL-31_CQ-I", "Gypsy-22_CQ-I_1p:Gypsy;_LTR_Retrotransposon;_Transposable_Element;_Gypsy-22_CQ_;_Gypsy-22_CQ-LTR;_Gypsy-22_CQ-I")
我想知道c1
中的c2
中的每个字符串是否都在c1[1]
中的相同索引处(忽略大小写),即如果c2[1]
中找到c1[2]
,{在c2[2]
中{1}},依此类推。
在实践中,向量可以有数百万个元素。
我目前的解决方案是
test <- Map(function(x,y) grepl(x,y, ignore.case = T), c1, c2)
但它没有矢量化,因此相对较慢。 有更好的解决方案吗?
答案 0 :(得分:3)
运行得非常快:
library(stringi)
c1 <- stri_rand_strings(1e6, 2)
c2 <- paste0(stri_rand_strings(1e6, 20), tolower(c1))
system.time(res <- stri_detect(c2, fixed = c1, case_insensitive = TRUE))
# User System verstrichen
# 0.73 0.00 0.75
部分原因是因为我没有检查正则表达式模式,而是检查常量字符串(fixed
),您也可以在grep*
中使用它。
答案 1 :(得分:1)
您可以使用stringr包尝试以下操作:
require(stringr)
require(data.table)
data <- data.table(c1, c2)
data[, FOUND:= str_detect(toupper(c2), toupper(c1))]
答案 2 :(得分:0)
哪些方法也有效,因为您的解决方案是使用apply
。
对于这个小例子,它运行良好,如果对于更大的数据更快,我不知道。
apply(rbind(c1,c2), 2, function(y){grepl(pattern = y[1],x=y[2], ignore.case = T)})
[1] TRUE FALSE TRUE TRUE FALSE
编辑: 我不得不再添加一个“BEL”来使其工作,因为你的c1由4个元素组成,c2为5