在我看来,子集和过滤器(来自 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
最佳答案
它们确实产生了相同的结果,并且它们在概念上非常相似。subset
的优势是它是基础 R 的一部分,不需要任何额外的包。对于小样本量,它似乎比 filter
快一点(在您的示例中快 6 倍,但以微秒为单位)。
随着数据集的增长,filter
似乎在效率上占了上风。在 15,000 条记录时,filter
超出 subset
大约 300 微秒。在 153,000 条记录中,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
关于r - 来自 dplyr 的子集和过滤器之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39882463/