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
'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
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