2016-10-05 10 views
12

サブセットとフィルタ(dplyrの)は同じ結果を示しているようです。 しかし、私の質問は、ある時点で、潜在的な違いがあるかどうかです。速度、それが処理できるデータサイズなど?どちらか一方を使用する方が良い場合がありますか?dplyrのサブセットとフィルタの相違点

例:

library(dplyr) 

df1<-subset(airquality, Temp>80 & Month > 5) 
df2<-filter(airquality, Temp>80 & Month > 5) 

summary(df1$Ozone) 
# Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 
# 9.00 39.00 64.00 64.51 84.00 168.00  14 

summary(df2$Ozone) 
# Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 
# 9.00 39.00 64.00 64.51 84.00 168.00  14 
+3

この投稿は、比較します'サブセット'、 'フィルター'、 'と'と '['、[使用するか、および/またはサブフレームのデータを使用する](http://stackoverflow.com/質問/ 24319747/dplyr-to-subset-a-data-frameの使い方) – OdeToMyFiddle

+1

主な違いは、 'サブセット'には '?subset'に警告があります:"これは対話的に使用するための便利な関数です。プログラミングのためには、[['のような標準的なサブセット関数を使用する方が良いし、特に引数のサブセットの非標準的な評価は予期しない結果をもたらす可能性があります。 'filter'は残りのdplyrとtidyverseと対話的にもプログラム的にも堅牢に動作するように設計されており、必要に応じて別の標準評価版' filter_'を持っています。また、カンマを '&'として扱います。 – alistaire

答えて

21

彼らは、確かに、同じ結果を生産している、と彼らは概念で非常に似ています。

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 
+0

先生、私にとっては結果は正反対です!どちらの場合も、サブセットは自分のマシン上でフィルタリングより優れています。 –

+0

それは半ダースの理由があります。気にするほど大きな実行の違いは何ですか? – Benjamin

+0

サブセット1.164632 1.220479 1.717666 1.266967 1.421527 、フィルタ5.314198 5.440985 5.669854 5.595846 5.793876 –

10

まだ言及されていない1つの追加の違いは、サブセットがないながらフィルタは、rownamesを破棄することである:

filter(mtcars, gear == 5) 

    mpg cyl disp  hp drat wt qsec vs am gear carb 
1 26.0 4  120.3  91 4.43 2.140 16.7 0 1 5 2 
2 30.4 4  95.1  113 3.77 1.513 16.9 1 1 5 2 
3 15.8 4  351.0  264 4.22 3.170 14.5 0 1 5 4 
4 19.7 4  145.0  175 3.62 2.770 15.5 0 1 5 6 
5 15.0 4  301.0  335 3.54 3.570 14.6 0 1 5 8 

subset(mtcars, gear == 5) 
       mpg cyl disp  hp drat wt qsec vs am gear carb 
Porsche 914-2 26.0 4  120.3  91 4.43 2.140 16.7 0 1 5 2 
Lotus Europa 30.4 4  95.1  113 3.77 1.513 16.9 1 1 5 2 
Ford Pantera L 15.8 4  351.0  264 4.22 3.170 14.5 0 1 5 4 
Ferrari Dino 19.7 4  145.0  175 3.62 2.770 15.5 0 1 5 6 
Maserati Bora 15.0 4  301.0  335 3.54 3.570 14.6 0 1 5 8 
1

興味深いです。私は、得られたデータセットの面で違いを確認しようとしていたと私は、「[」演算子は(すなわち、それはまた、NASに戻した理由に)異なる挙動を理由に説明を取得coulnd't:

# Subset for year=2013 
sub<-brfss2013 %>% filter(iyear == "2013") 
dim(sub) 
#[1] 486088 330 
length(which(is.na(sub$iyear))==T) 
#[1] 0 

sub2<-filter(brfss2013, iyear == "2013") 
dim(sub2) 
#[1] 486088 330 
length(which(is.na(sub2$iyear))==T) 
#[1] 0 

sub3<-brfss2013[brfss2013$iyear=="2013", ] 
dim(sub3) 
#[1] 486093 330 
length(which(is.na(sub3$iyear))==T) 
#[1] 5 

sub4<-subset(brfss2013, iyear=="2013") 
dim(sub4) 
#[1] 486088 330 
length(which(is.na(sub4$iyear))==T) 
#[1] 0 
関連する問題