0

これら 2 つの異なる実装方法が異なる結果をもたらすのはどのような場合ですか?

data(mtcars)
firstWay <- mtcars[grepl('6',mtcars$cyl),]
SecondWay <- mtcars[mtcars$cyl=='6',]

これらの方法で常に同じ結果が得られる場合、推奨される方法とその理由は? ありがとう

4

3 に答える 3

3

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 つ) があります。

于 2015-06-13T17:33:13.927 に答える
2

ええと、最初の違いは、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、低レベル言語で記述されたような高速なツールに依存する可能性があります。

于 2015-06-13T17:28:26.953 に答える
1

パッケージのマイクロベンチマークを使用すると、どちらが速いかがわかります

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
于 2015-06-13T17:30:24.047 に答える