在我看来,子集和过滤器(来自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的优点是它是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 

R相关问答推荐

有没有方法将paste 0功能与列表结合起来?

更新合适的R mgcv::bam模型报告无效类型(关闭).'';错误

查找具有平局的多个列的最大值并返回列名或平局 destruct 者NA值

如何根据条件计算时差(天)

保存包含循环和ifelse的函数的输出

将复杂的组合列表转换为数据框架

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

在R中替换函数中的特定符号

RStudio中相关数据的分组箱形图

如何改变时间图R中的悬停信息?

计算具有奇数日期的运行金额

R—将各种CSV数字列转换为日期

SHINY:使用JS函数应用的CSS样式显示HTML表格

查找所有站点的最小值

在另一个包中设置断点&S R函数

如何在R中改变fviz_pca_biplot中圆的边界线的 colored颜色 ?

为什么我对圆周率图的蒙特卡罗估计是空的?

SHILINY中DT列的条件着色

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

如何修改GT表中组名行的 colored颜色 ?