【发布时间】:2012-04-09 05:54:27
【问题描述】:
当我需要过滤一个data.frame,即提取满足特定条件的行时,我更喜欢使用subset函数:
subset(airquality, Month == 8 & Temp > 90)
而不是[函数:
airquality[airquality$Month == 8 & airquality$Temp > 90, ]
我偏爱的主要原因有两个:
-
我发现代码从左到右读起来更好。即使对 R 一无所知的人也能知道上面的
subset语句在做什么。 -
因为在
select表达式中列可以被称为变量,所以我可以省去一些击键。在我上面的例子中,我只需用subset输入一次airquality,但用[输入3 次。
所以我过着幸福的生活,到处使用subset,因为它更短且可读性更好,甚至向我的 R 程序员同伴宣传它的美感。但是昨天我的世界分崩离析。在阅读subset 文档时,我注意到这一部分:
警告
这是一个旨在以交互方式使用的便利功能。对于编程来说,最好使用像 [ 这样的标准子集函数,特别是参数子集的非标准评估可能会产生意想不到的后果。
有人可以帮助澄清作者的意思吗?
首先,“交互式使用”是什么意思?我知道什么是交互式会话,而不是在 BATCH 模式下运行的脚本,但我看不出它应该有什么不同。
那么,您能否解释一下“参数子集的非标准评估”以及为什么它是危险的,可以提供一个例子吗?
【问题讨论】:
-
与
with(airquality, airquality[Month == 8 & Temp > 90, ])一起使用的数量略少(但比子集少) -
你也可以看看'The R Inferno'burns-stat.com/pages/Tutor/R_inferno.pdf的Circleces 8.2.31和8.2.32@
-
改用 data.table,默认语法类似于 airquality[Month == 8 & Temp > 90,] - 可读性强,速度更快。
-
好的。所以如果子集不好用 - 那 [ vs. dplyr::filter() 呢?
-
对于那些想知道的人,
dplyr::filter也有同样的问题。 IE。如果环境碰巧有一个具有该名称的变量,它将使用它而不是数据框中的变量。使调试混乱!