为什么``比'subset`好?

当我需要过滤数据帧时,即提取符合某些条件的行时,我更愿意使用subset函数:

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

[函数:

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

我的偏好主要有两个原因:

  • 我发现代码读起来更好,从左到右。 即使对R一无所知的人也可以知道上面的subset声明正在做什么。

  • 因为列可以在select表达式中被称为变量,所以我可以节省一些击键。 在我上面的例子中,我只需要用subset键入一次airquality ,但是用[

  • 所以我活得很开心,每个地方都使用subset ,因为它更短,读得更好,甚至向我的R编码人员提倡它的美。 但昨天我的世界分崩离析了。 在阅读subset文档时,我注意到这一部分:

    警告

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

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

    首先,“交互使用”意味着什么? 我知道什么是交互式会话,而不是脚本在BATCH模式下运行,但我没有看到它应该有什么不同。

    那么,你能否解释一下“非标准评价子集”以及它为什么很危险,或许可以提供一个例子?


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

    这是一个有点长的阅读,所以在这里记录哈德利使用的例子可能会有所帮助,这些例子大多直接解决了“什么可能出错?”的问题:

    哈德利提出了以下例子:假设我们想要使用以下函数对数据框进行子集和重新排序:

    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)
    

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


    [更快:

    require(microbenchmark)        
    microbenchmark(subset(airquality, Month == 8 & Temp > 90),airquality[airquality$Month == 8 & airquality$Temp > 90,])
        Unit: microseconds
                                                               expr     min       lq   median       uq     max neval
                         subset(airquality, Month == 8 & Temp > 90) 301.994 312.1565 317.3600 349.4170 500.903   100
         airquality[airquality$Month == 8 & airquality$Temp > 90, ] 234.807 239.3125 244.2715 271.7885 340.058   100
    
    链接地址: http://www.djcxy.com/p/12831.html

    上一篇: Why is `[` better than `subset`?

    下一篇: What is the difference between require() and library()?