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

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])

有人可以解释一下,这里发生了什么,为什么?

最佳答案

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() 在您的示例中返回全局环境。
  • eval 调用的第二个参数 x 称为 envir 。它是评估表达式的环境(或列表或数据框,...)。在您的情况下,R 评估 Species == Species[i] 内的 x ,这是您的数据框。

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

    也可以看看 ? eval

    关于r - 为什么子集不适用于与列名称相同的向量名称?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10815696/

    10-13 09:37