一般に、最初はベクトル化された関数を使用するようにしてください。を使用strsplit
すると、後でなんらかの反復が必要になることがよくあります (速度が遅くなります)。あなたの例では、nchar
代わりに次を使用する必要があります。
> nchar(words)
[1] 1 5 5 3
より一般的にはstrsplit
、 がリストを返すという事実を利用して、次のように使用しますlapply
。
> as.numeric(lapply(strsplit(words,""), length))
[1] 1 5 5 3
または、 のl*ply
ファミリ関数を使用しplyr
ます。例えば:
> laply(strsplit(words,""), length)
[1] 1 5 5 3
編集:
Bloomsdayを記念して、Joyce の Ulysses を使用してこれらのアプローチのパフォーマンスをテストすることにしました。
joyce <- readLines("http://www.gutenberg.org/files/4300/4300-8.txt")
joyce <- unlist(strsplit(joyce, " "))
すべての単語が揃ったので、カウントを行うことができます。
> # original version
> system.time(print(summary(sapply(joyce, function (x) length(strsplit(x,"")[[1]])))))
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 3.000 4.000 4.666 6.000 69.000
user system elapsed
2.65 0.03 2.73
> # vectorized function
> system.time(print(summary(nchar(joyce))))
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 3.000 4.000 4.666 6.000 69.000
user system elapsed
0.05 0.00 0.04
> # with lapply
> system.time(print(summary(as.numeric(lapply(strsplit(joyce,""), length)))))
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 3.000 4.000 4.666 6.000 69.000
user system elapsed
0.8 0.0 0.8
> # with laply (from plyr)
> system.time(print(summary(laply(strsplit(joyce,""), length))))
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 3.000 4.000 4.666 6.000 69.000
user system elapsed
17.20 0.05 17.30
> # with ldply (from plyr)
> system.time(print(summary(ldply(strsplit(joyce,""), length))))
V1
Min. : 0.000
1st Qu.: 3.000
Median : 4.000
Mean : 4.666
3rd Qu.: 6.000
Max. :69.000
user system elapsed
7.97 0.00 8.03
ベクトル化された関数は、元のバージョンlapply
よりもかなり高速です。sapply
すべてのソリューションが同じ回答を返します (要約出力に見られるように)。
どうやら の最新バージョンのplyr
方が速いようです (これは少し古いバージョンを使用しています)。