彼らは、確かに、同じ結果を生産している、と彼らは概念で非常に似ています。
subset
の利点は、それがベースRの一部であり、追加のパッケージを必要としないことです。小さなサンプルサイズでは、filter
より少し速いようです(あなたの例では6倍高速ですが、それはマイクロ秒で測定されます)。
データセットが増加するにつれて、filter
が効率を上回るように見えます。 15,000レコードでは、filter
は、約300マイクロ秒で、subset
を超えています。 153,000レコードで、filter
は3倍高速(ミリ秒単位)です。
人間の時間の点では、私は2つの間に多くの違いがあるとは思わない。
もう1つの利点は、filter
がデータをメモリに取り込まずにSQLデータベース上で動作できることです(これはちょっとした利点です)。 subset
は単にそれをしません。
私はすでにdplyr
フレームワークを使用しているため、個人的にはfilter
を使用する傾向があります。メモリ不足のデータを扱っていない場合、大きな違いはありません。
library(dplyr)
library(microbenchmark)
# Original example
microbenchmark(
df1<-subset(airquality, Temp>80 & Month > 5),
df2<-filter(airquality, Temp>80 & Month > 5)
)
Unit: microseconds
expr min lq mean median uq max neval cld
subset 95.598 107.7670 118.5236 119.9370 125.949 167.443 100 a
filter 551.886 564.7885 599.4972 571.5335 594.993 2074.997 100 b
# 15,300 rows
air <- lapply(1:100, function(x) airquality) %>% bind_rows
microbenchmark(
df1<-subset(air, Temp>80 & Month > 5),
df2<-filter(air, Temp>80 & Month > 5)
)
Unit: microseconds
expr min lq mean median uq max neval cld
subset 1187.054 1207.5800 1293.718 1216.671 1257.725 2574.392 100 b
filter 968.586 985.4475 1056.686 1023.862 1036.765 2489.644 100 a
# 153,000 rows
air <- lapply(1:1000, function(x) airquality) %>% bind_rows
microbenchmark(
df1<-subset(air, Temp>80 & Month > 5),
df2<-filter(air, Temp>80 & Month > 5)
)
Unit: milliseconds
expr min lq mean median uq max neval cld
subset 11.841792 13.292618 16.21771 13.521935 13.867083 68.59659 100 b
filter 5.046148 5.169164 10.27829 5.387484 6.738167 65.38937 100 a
この投稿は、比較します'サブセット'、 'フィルター'、 'と'と '['、[使用するか、および/またはサブフレームのデータを使用する](http://stackoverflow.com/質問/ 24319747/dplyr-to-subset-a-data-frameの使い方) – OdeToMyFiddle
主な違いは、 'サブセット'には '?subset'に警告があります:"これは対話的に使用するための便利な関数です。プログラミングのためには、[['のような標準的なサブセット関数を使用する方が良いし、特に引数のサブセットの非標準的な評価は予期しない結果をもたらす可能性があります。 'filter'は残りのdplyrとtidyverseと対話的にもプログラム的にも堅牢に動作するように設計されており、必要に応じて別の標準評価版' filter_'を持っています。また、カンマを '&'として扱います。 – alistaire