r - 来自 dplyr 的子集和过滤器之间的区别

标签 r filter subset

在我看来,子集和过滤器(来自 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/

相关文章:

as.character 的结果取决于向量内容(re : pasting a POSIX date-time)

r - 根据行子集上的逻辑条件对数据框进行子集化

将递归列表的所有值替换为向量的值

r - 如何对字符串变量使用 cut 函数?

r - 如何增加ggplot2图例中点的大小?

javascript - 如何在 JavaScript 中过滤这些搜索结果?

python - 来自太阳的运动检测照明

r - 按列过滤数据集中的行

R 惰性评估- 不工作

elasticsearch - Elasticsearch忽略聚合中的过滤器