它们确实产生了相同的结果,而且在概念上非常相似.
subset
的优点是它是base R的一部分,不需要任何额外的包.对于小样本量,它似乎比filter
快一点(在你的例子中是6倍,但以微秒为单位).
随着数据集的增长,filter
似乎在效率上占了上风.在15000条记录中,filter
条比subset
条快了约300微秒.在153000条记录中,filter
条记录的速度快了三倍(以毫秒为单位).
所以就人类时间而言,我认为两者没有太大区别.
另一个优势(这是一个小众优势)是filter
可以在SQL数据库上运行,而无需将数据拉入内存.subset
根本不能做到这一点.
就个人而言,我倾向于使用filter
,但这只是因为我已经在使用dplyr
框架.如果你不处理内存不足的数据,这不会有多大区别.
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