2016-10-05 14 views
12

Dường như với tôi rằng tập hợp con và bộ lọc (từ dplyr) có cùng kết quả. Nhưng câu hỏi của tôi là: có một điểm nào đó là một sự khác biệt tiềm năng, ví dụ: tốc độ, kích thước dữ liệu nó có thể xử lý vv? Có dịp nào tốt hơn khi sử dụng cái này hay cái kia không?Sự khác biệt giữa tập hợp con và bộ lọc từ dplyr

Ví dụ:

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

'tập hợp con',' bộ lọc', 'với' và' [', [cách sử dụng-hoặc-và-trong-dplyr-tới-tập con-một-dữ liệu-khung] (http://stackoverflow.com/ question/24319747/how-to-use-hoặc-và-trong-dplyr-to-subset-a-data-frame) – OdeToMyFiddle

+1

Sự khác biệt chính là 'tập con' đi kèm với một cảnh báo trong'? subset': "Đây là Để lập trình tốt hơn là sử dụng các hàm subsetting tiêu chuẩn như '[', và đặc biệt việc đánh giá phi tiêu chuẩn của tập con đối số có thể có hậu quả không lường trước được. " 'filter' được thiết kế để làm việc mạnh mẽ với phần còn lại của dplyr và tidyverse, cả hai tương tác và lập trình, và có một phiên bản tiêu chuẩn-eval riêng' filter_' cho khi cần thiết. Ngoài ra, nó xử lý dấu phẩy là '&'. – alistaire

Trả lời

21

Chúng được, thực sự, tạo ra kết quả giống nhau, và họ rất giống nhau trong khái niệm.

Lợi thế của subset là nó là một phần của cơ sở R và không yêu cầu bất kỳ gói bổ sung nào. Với kích thước mẫu nhỏ, nó có vẻ nhanh hơn một chút so với filter (ví dụ của bạn nhanh hơn 6 lần, nhưng được đo bằng micro giây).

Khi các tập dữ liệu phát triển, filter dường như đã đạt được hiệu quả cao hơn. Tại 15.000 bản ghi, filter các khoảng trắng subset khoảng 300 micro giây. Và tại 153.000 hồ sơ, filter nhanh gấp ba lần (tính bằng mili giây).

Vì vậy, về thời gian của con người, tôi không nghĩ có nhiều sự khác biệt giữa hai người.

Ưu điểm khác (và đây là một lợi thế thích hợp) là filter có thể hoạt động trên cơ sở dữ liệu SQL mà không cần kéo dữ liệu vào bộ nhớ. subset chỉ đơn giản là không làm điều đó.

Cá nhân, tôi có xu hướng sử dụng filter, nhưng chỉ vì tôi đã sử dụng khung dplyr. Nếu bạn không làm việc với dữ liệu ngoài bộ nhớ, nó sẽ không tạo ra nhiều khác biệt.

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

Thưa ông, đối với tôi kết quả là đối diện! Đối với cả hai trường hợp, tập hợp con hoạt động tốt hơn bộ lọc trên máy của tôi. –

+0

có thể có một nửa tá lý do cho điều đó. sự khác biệt trong việc thực hiện đủ lớn để quan tâm? – Benjamin

+0

tập hợp con 1.164632 1.220479 1.717666 1.266967 1.421527 , lọc 5.314198 5.440985 5.669854 5.595846 5.793876 –

10

Một khác biệt khác chưa được đề cập là bộ lọc vứt bỏ rownames, trong khi nhóm không:

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

Thú vị. Tôi đã cố gắng để thấy sự khác biệt về số liệu kết quả và tôi không nhận được giải thích tại sao toán tử "[" hoạt động khác (nghĩa là tại sao nó cũng trả về NA):

# 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 
Các vấn đề liên quan