r - 为什么 `[` 比 `subset` 更好?

标签 r filter subset r-faq

当我需要过滤 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 文档时,我注意到这一部分:

Warning

This is a convenience function intended for use interactively. For programming it is better to use the standard subsetting functions like [, and in particular the non-standard evaluation of argument subset can have unanticipated consequences.

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

首先,“交互使用”是什么意思?我知道什么是交互式 session ,而不是在批处理模式下运行的脚本,但我不知道它应该产生什么区别。

那么,您能否解释一下“参数子集的非标准评估”以及为什么它是危险的,也许可以提供一个例子?

最佳答案

这个问题在 @James 的评论中得到了很好的回答,他指出 Hadley Wickham 对 subset (以及类似函数)的危险做了很好的解释 [here] 。快去读吧!

阅读起来有点长,因此在这里记录 Hadley 使用的示例可能会有所帮助,该示例最直接地解决了“什么可能会出错?”的问题:

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

scramble <- function(x) x[sample(nrow(x)), ]

subscramble <- function(x, condition) {
  scramble(subset(x, condition))
}

subscramble(mtcars, cyl == 4)

这会返回错误:

Error in eval(expr, envir, enclos) : object 'cyl' not found

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

cyl <- 4
subscramble(mtcars, cyl == 4)

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

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

关于r - 为什么 `[` 比 `subset` 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9860090/

相关文章:

r - 具有position_stack的抖动文本/标签

r - 检查一个数据帧的每一行是否包含在另一个数据帧中

r - 如何像箱线图一样在 R 中创建分类散点图?

r - 如何绘制混合模型的结果

java - 带有查询 Dsl 自定义绑定(bind)和/或操作的 Spring 不起作用

滚动应用于向量的子集

delphi - Delphi:使用枚举器按类类型过滤TList <T:class>吗?

php - 使用下拉菜单动态过滤 Wordpress 帖子(使用 php 和 ajax)

python - Pandas 在数据帧子集上设置行值

r - 为什么在将子集应用于 R 中的数据框列表时找不到函数传递的参数