【问题标题】:Why subset does not work with a vector name identical to a column name?为什么子集不适用于与列名相同的向量名称?
【发布时间】:2012-05-30 11:48:31
【问题描述】:

我遇到了一个令人困惑的子集函数“功能”(使用列名作为子集的向量名称不起作用):

data(iris)
Species <- unique(iris$Species)
i <- 2
Species[i]
subset(iris, subset = Species == Species[i])

sp <- unique(iris$Species)
sp[i]
subset(iris, subset = Species == sp[i])

谁能解释一下,这里发生了什么以及为什么?

【问题讨论】:

    标签: r subset


    【解决方案1】:

    subset() 将首先在数据框中查找您提到的任何对象,因此在您的第一个示例中,Species[i] 返回“setosa”(与iris$Species[i] 相同)。只有当您指定的对象在数据框中找不到时,R 才会在父帧中查找并在那里找到正确的对象。

    所以这一切都有效,你只是不明白它是如何工作的。您可以在帮助文件中阅读此内容:

    请注意,子集将在数据框中进行评估,因此列可以 在表达式中被(按名称)称为变量(参见 示例)。

    这是怎么发生的?

    原因是subset()中的以下代码行:

    e <- substitute(subset)
    r <- eval(e, x, parent.frame())
    
    • subset(或e)在你的例子中Species == Species[i]
    • x 在您的示例中 iris
    • parent.frame() 在您的示例中返回全局环境。

    调用evalx 的第二个参数称为envir。它是评估表达式的环境(或列表或数据框,...)。在您的情况下,R 评估 Species == Species[i] inside x,这是您的数据框。

    第三个参数parent.frame() 是外壳。这是包含您指定的数据框 als 环境的环境,并且是 R 将在数据框中找不到变量的情况下查找的地方。

    另请参阅 ?eval

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-23
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-17
      • 2014-12-28
      • 1970-01-01
      相关资源
      最近更新 更多