我遇到了子集函数的一个令人困惑的“特征”(使用列名作为子集的向量名不起作用):
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/