str_count 関数は,第1引数の文字列中に,第2引数の文字列が何回あるかを返す関数だということだが,第2引数の長さが1の場合には,strsplit を使って第1引数を1文字のベクトルにして比較演算をする方がはるかに速い。
library(stringr)
func1 = function(n0) {
count = 0
for (n in 1:n0) {
count = count+str_count(n, "7")
}
count
}
func2 = function(n0) {
count = 0
for (n in 1:n0) {
count = count+sum(unlist(strsplit(as.character(n), "")) == "7")
}
count
}
> n0 = 99999
> system.time(print(func1(n0)))
[1] 50000
ユーザ システム 経過
9.800 0.044 9.795
> system.time(print(func2(n0)))
[1] 50000
ユーザ システム 経過
0.684 0.003 0.683
> system.time(replicate(10000, str_count("67867899878786789999999999", "7")))
ユーザ システム 経過
0.910 0.004 0.939
> system.time(replicate(10000, sum(unlist(strsplit("67867899878786789999999999", "")) == "7")))
ユーザ システム 経過
0.079 0.002 0.095