これら 2 つの異なる実装方法が異なる結果をもたらすのはどのような場合ですか?
data(mtcars)
firstWay <- mtcars[grepl('6',mtcars$cyl),]
SecondWay <- mtcars[mtcars$cyl=='6',]
これらの方法で常に同じ結果が得られる場合、推奨される方法とその理由は? ありがとう
mtcars$cyl
は数値列なので、mtcars[mtcars$cyl == 6, ] を使用して数値と比較した方がよいでしょう。
==
しかし、等値演算子との違いは、grepl
と等しいベクトルのメンバーに対して==
のみ適用され、その中のどこかに 6 を持つベクトルの任意のメンバーに一致します。TRUE
"6"
grepl
たとえば、次のようになります。
String == grepl
6 TRUE TRUE
123456 FALSE TRUE
6ABC FALSE TRUE
This is a long sentence which happens to have a 6 in it FALSE TRUE
Whereas this long sentence does not FALSE FALSE
同等のgrepl
パターンは "^6$" です。http://www.regular-expressions.info/tutorial.htmlに、正規表現に関するチュートリアル (多数のうちの 1 つ) があります。
ええと、最初の違いは、grepl
たとえば をまだ知らない場合でもサブセット化できること6
ですが、 で始まる行または で終わる行を検索しようとすることができます6
。
通常のサブセット化手法でこれを実行しようとすると、空のオブジェクトが作成されます。たとえば^6
、 は正規表現として認識されず、記号^
andを含む文字列として認識されるため6
です。
他にも違いがあると思いますが、プロのユーザーがより詳細な回答を提供してくれると確信しています.
どちらが優先されるサイド OS については、効率の理由が考えられます。
system.time(mtcars[grepl('^6',mtcars$cyl),])
user system elapsed
0.029 0.002 0.035
system.time(mtcars[mtcars$cyl=='6',])
user system elapsed
0.031 0.002 0.046
この小さな例は単なるガイドになる可能性があり、@Nick Kが最初に示唆したように、microbenchmark
. もちろん、大規模なデータセットでは、プロのユーザー (または速度が必要なユーザー) が両方を好むとはほとんど信じていませんが、データ テーブルやdplyr
、低レベル言語で記述されたような高速なツールに依存する可能性があります。
パッケージのマイクロベンチマークを使用すると、どちらが速いかがわかります
library(microbenchmark)
m <- microbenchmark(mtcars[grepl('6',mtcars$cyl),], mtcars[mtcars$cyl=='6',], times=10000)
Unit: microseconds
expr min lq mean median uq max neval
mtcars[grepl("6", mtcars$cyl), ] 229.080 234.738 247.5324 236.693 239.417 6713.914 10000
mtcars[mtcars$cyl == "6", ] 214.902 220.210 231.0240 221.956 224.471 7759.507 10000
==
より速いように見えるので、可能な場合はそれを使用する必要があります
ただし、関数はまったく同じことを行うわけではありません。grepl
文字列が存在するかどうかを検索し==
、式が等しいかどうかをチェックします
grepl("6", mtcars$disp)
[1] TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE TRUE FALSE
[18] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
mtcars$disp == "6"
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[18] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE