【发布时间】:2019-04-02 10:29:21
【问题描述】:
我正在使用下面的代码创建一个矩阵,该矩阵比较一个向量中的所有字符串,以查看它们是否包含第二个向量中的任何模式:
strngs <- c("hello there", "welcome", "how are you")
pattern <- c("h", "e", "o")
M <- matrix(nrow = length(strngs), ncol = length(pattern))
for(i in 1:length(strngs)){
for(j in 1:length(pattern)){
M[i, j]<-str_count(strngs[i], pattern[j])
}
}
M
效果很好,并返回我正在寻找的矩阵:
[,1] [,2] [,3]
[1,] 2 3 1
[2,] 0 2 1
[3,] 1 1 2
但是,我的真实数据集非常庞大,这样的循环不能很好地扩展到具有 117、746、754 值的矩阵。有谁知道我可以将它矢量化或以其他方式加速它的方法?还是我应该只学习 C++? ;)
谢谢!
【问题讨论】:
-
首先你应该能够通过使用
stringi::stri_count_fixed()而不是stringr::str_count()来实现一些加速 -
太棒了,谢谢。出于好奇,你是怎么知道的?只是想学习。
-
因为你的问题是关于速度的,如果你提供一个相关大小的向量会很好(除了当前的小例子,它确实很好地显示了预期的结果!),例如
x <- rep(strngs, 1e6)(还有更多模式?)以及关于所需时间的一些想法。干杯
标签: r loops matrix vectorization