我遇到了子集函数的一个令人困惑的“功能”(使用列名作为子集的向量名称不起作用):
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]
inside x
,这是您的数据框。
第三个参数parent.frame()
是外壳。这是包含您指定的数据框 als 环境的环境,并且是 R 在数据框中找不到变量的情况下将查找的地方。
也可以看看 ?eval