我有一个包含短字符串的字符向量:
short <- c("aaa", "bah", "dju", "kjs")
我想计算下面向量中至少有一个上述短字符串的字符串数。
long <- c("aaajhd", "slilduaaadifh", "sldifjsdbahsdofiusd", "sdflisjdjukjs", "sldifjbak", "sdfoiuwebss", "sdkfuhsd", "sdlfihwoio")
它应输出的数字是4,因为long
向量中的4个字符串包含short
向量中定义的较短字符串。
我的实际短向量大约是10000个字符串,长度大约是1000,所以我正在寻找一种有效的计算方法。
谢谢!
答案 0 :(得分:4)
我的笔记本电脑大概需要0.12秒,其中long
和short
来自最后的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_count
和Reduce
获取到单个逻辑向量以获取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)