当我需要过滤data.frame,即提取满足特定条件的行时,我更喜欢使用subset函数:

subset(airquality, Month == 8 & Temp > 90)

而不是[功能:

airquality[airquality$Month == 8 & airquality$Temp > 90, ]

我偏好有两个主要原因:

  1. 我发现代码从左到右读得更好。 即使对R一无所知的人也可以说出上面的subset声明在做什么。

  2. 因为列可以在select表达式中称为变量,所以我可以保存几个键击。 在我上面的例子中,我只需要用subset键入一次airquality ,而用[

所以我过着快乐的生活,在任何地方都使用subset ,因为它更短,读起来更好,甚至为我的同事R编码器提倡它的美感。 但昨天我的世界崩溃了。 在阅读subset文档时,我注意到这一节:

警告

这是一种便于交互使用的便利功能。 对于编程,最好使用像[的标准子集函数,特别是参数子集的非标准评估可能会产生意想不到的后果。

有人可以帮助澄清作者的意思吗?

首先,他们的意思是“ 交互使用 ”? 我知道什么是交互式会话,而不是在BATCH模式下运行的脚本,但我不知道它应该有什么区别。

那么,请你解释一下“ 论证子集的非标准评估 ”以及为什么它是危险的,或许可以提供一个例子?


#1楼

另外[更快:

require(microbenchmark)
microbenchmark(subset(airquality, Month == 8 & Temp > 90),airquality[airquality$Month == 8 & airquality$Temp > 90,])Unit: microsecondsexpr     min       lq   median       uq     max nevalsubset(airquality, Month == 8 & Temp > 90) 301.994 312.1565 317.3600 349.4170 500.903   100airquality[airquality$Month == 8 & airquality$Temp > 90, ] 234.807 239.3125 244.2715 271.7885 340.058   100

#2楼

这个问题在@James的评论中得到了很好的回答,指出了Hadley Wickham对子subset (和类似函数) [这里]的危险性的一个很好的解释。 去读吧!

这是一个有点长的阅读,所以在这里记录Hadley使用的最直接解决“什么可能出错?”的问题可能会有所帮助:

Hadley建议使用以下示例:假设我们要使用以下函数对数据框进行子集化然后重新排序:

scramble <- function(x) x[sample(nrow(x)), ]subscramble <- function(x, condition) {scramble(subset(x, condition))
}subscramble(mtcars, cyl == 4)

这会返回错误:

eval(expr,envir,enclos)出错:找不到对象'cyl'

因为R不再“知道”在哪里找到名为'cyl'的对象。 他还指出,如果在全球环境中有一个名为'cyl'的对象,可能会发生真正奇怪的事情:

cyl <- 4
subscramble(mtcars, cyl == 4)cyl <- sample(10, 100, rep = T)
subscramble(mtcars, cyl == 4)

(运行它们并亲眼看看,它非常疯狂。)

为什么`[`比`子集更好?相关推荐

  1. Web的现状:网页性能提升指南

    互联网发展非常迅速,所以我们创造了Web平台.通常 我们会忽视连通性等问题,但用户们却不会视而不见 .一瞥万维网的现状,可以发现我们并没有用同情心.变通意识去构建它,更不要说性能了. 所以,今天的We ...

  2. 看动画轻松理解“递归”与“动态规划”

    作者 | 程序员小吴 来源 | 五分钟学算法 在学习「数据结构和算法」的过程中,因为人习惯了平铺直叙的思维方式,所以「递归」与「动态规划」这种带循环概念(绕来绕去)的往往是相对比较难以理解的两个抽象知 ...

  3. c 递归下降识别程序_看动画轻松理解递归与动态规划

    在学习「数据结构和算法」的过程中,因为人习惯了平铺直叙的思维方式,所以「递归」与「动态规划」这种带循环概念(绕来绕去)的往往是相对比较难以理解的两个抽象知识点. 程序员小吴打算使用动画的形式来帮助理解 ...

  4. 关联规则(Association Rules)笔记

    1 关联规则产生的原因:购物篮问题 关联规则最初是为了解决购物篮问题而产生.上世纪九十年代,美国的沃尔玛超市发现,啤酒和尿布这两种完全不着边际的商品竟然有很高的概率一起被购买. 在一段时间之后,他终于 ...

  5. 【干货】从国外知名网站看用户体验4个基本标准

    送给真正的互联网人一顿干货早餐 [小咖导读]文自百度ued,很多人把用户体验和易用性这两个术语混为一谈,然而,易用性被越来越多的用于用户完成某项预定任务的难易程度,它往往与可用性测试联系在一起.因此, ...

  6. 机器学习算法_机器学习算法中分类知识总结!

    ↑↑↑关注后"星标"Datawhale每日干货 & 每月组队学习,不错过Datawhale干货 译者:张峰,Datawhale成员 本文将介绍机器学习算法中非常重要的知识- ...

  7. 【机器学习基础】机器学习算法中分类知识总结!

    译者:张峰,Datawhale成员 本文将介绍机器学习算法中非常重要的知识-分类(classification),即找一个函数判断输入数据所属的类别,可以是二类别问题(是/不是),也可以是多类别问题( ...

  8. 06_特征选择,特征选择的原因,sklearn特征选择API

    1.特征选择 在现实生活中,一个对象往往具有很多属性(以下称为特征),这些特征大致可以被分成三种主要的类型: 1.相关特征: 对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果: 2.无关特征 ...

  9. 回归分析中自变量共线性_具有大特征空间的回归分析中的变量选择

    回归分析中自变量共线性 介绍 (Introduction) Performing multiple regression analysis from a large set of independen ...

最新文章

  1. 陶哲轩挑战失败的百年数学问题,被两名在家隔离的数学家破解了
  2. uipath sequence传递参数_多孔材料测试及声学参数识别(中)_多孔材料声学参数正向识别...
  3. JS中Base64的编码与解码
  4. jQuery实例——展示表格点击变色、全选、删除
  5. ASP.NET 应用程序遭遇Server Application Unavailable问题的解决的方法
  6. 如何把网址配置为http和https可以同时访问
  7. java值参_JAVA赋值和传参理解
  8. PyTorch 成程序员“新宠”,TensorFlow 风光不再?
  9. 探究position定位中absolute和relative的异同
  10. 九大背包问题专题--背包问题求具体方案数
  11. xp 系统 mysql日志文件在哪里_SqlServer修改数据库文件及日志文件存放位置教程
  12. MYsql源码及其剖析
  13. Webmagic爬虫框架
  14. 4个方法,教你1分钟查询你的手机注册了多少软件和网站
  15. win10电脑插耳机没反应(win10插上耳机还外放)
  16. uniapp editor富文本编辑器,h5富文本编辑器封装成插件
  17. Android获取桌面应用程序
  18. linux下Ftp客户端程序与Makefile
  19. pm2启动node项目
  20. 喷墨打印机的使用 hp LaserJet 1010 HB 打印顺序

热门文章

  1. CUSTOMDRAW msdn网站
  2. 自定义RadioGrop,支持添加包裹着的RadioButton
  3. tools.jar seem to ....
  4. Android登录拦截器实现方式(二)
  5. ScheduledThreadPoolExecutor的相关知识
  6. 配置linux下node节点的ip
  7. SDWebImage 在Swift中遇坑解决
  8. JMeter和JMeterPlugin的下载安装
  9. iOS 11 UIScrollView的新特性(automaticallyAdjustsScrollViewInsets 不起作用了)
  10. Repeater控件使用小结持续更新