计算包含已定义的较短字符串的字符串数的有效方法

时间:2017-12-10 19:21:03

标签: r

我有一个包含短字符串的字符向量:

short <- c("aaa", "bah", "dju", "kjs")

我想计算下面向量中至少有一个上述短字符串的字符串数。

long <- c("aaajhd", "slilduaaadifh", "sldifjsdbahsdofiusd", "sdflisjdjukjs", "sldifjbak", "sdfoiuwebss", "sdkfuhsd", "sdlfihwoio")

它应输出的数字是4,因为long向量中的4个字符串包含short向量中定义的较短字符串。

我的实际短向量大约是10000个字符串,长度大约是1000,所以我正在寻找一种有效的计算方法。

谢谢!

3 个答案:

答案 0 :(得分:4)

我的笔记本电脑大概需要0.12秒,其中longshort来自最后的Note,长度为10000和1000.不使用任何包 - 仅用于生成样本数据。

system.time(num <- length(grep(paste(short, collapse = "|"), long, perl = TRUE)))
   user  system elapsed 
   0.08    0.00    0.12 

相比之下,Reduce / str_count解决方案需要6.5秒。

注意:我们将Ulysses一书中的前1000个和10000个单词作为样本数据。

library(gsubfn)

u <- "http://www.gutenberg.org/files/4300/4300-0.txt"
joyce <- readLines(u)
joycec <- paste(joyce, collapse = " ") 
words <- strapplyc(joycec, "\\w+")[[1]]
short <- head(words, 1000)
long <- head(words, 10000)

答案 1 :(得分:1)

我们遍历&#39;短片&#39;向量,将str_countReduce获取到单个逻辑向量以获取sum

library(stringr)
sum(Reduce(`|`, lapply(short, str_count, string = long)))
#[1] 4

str_count使用stringi函数,这不依赖于length

vector

答案 2 :(得分:0)

上面提供的数据只需要0.09秒。

system.time(sum(sapply(regmatches(long, gregexpr(paste(short, collapse = "|"), long, ignore.case = F, perl = T)), length) >= 1))
   User      System verstrichen 
   0.09        0.00        0.09

数据:

library(gsubfn)
u <- "http://www.gutenberg.org/files/4300/4300-0.txt"
joyce <- readLines(u)
joycec <- paste(joyce, collapse = " ") 
words <- strapplyc(joycec, "\\w+")[[1]]
short <- head(words, 1000)
long <- head(words, 10000)