通过 [] 子集数据框

subsetting data frame by []

我有一个名为 df 的数据框

> df <- data.frame(x = 1:3, y = 3:1, z = 7:9)
> df
  x y z
1 1 3 7
2 2 2 8
3 3 1 9

当我尝试用 x<= 2 对数据框 df 进行子集化时,我做了

> df[df$x <= 2, ,]
  x y z
1 1 3 7
2 2 2 8

我觉得这段代码是对的。但是,这是我的错字,所以我写了这样的代码

> df[,df$x <= 2,]
  x y
1 1 3
2 2 2
3 3 1

我认为代码 df[ , df$x <= 2 , ] 会出错。但是控制台向我显示了上面的输出。有没有人解释为什么它显示输出以及输出是什么意思?

谢谢

一个数据框有两个索引:第一个用于行,第二个用于列。因此,为了从数据框中获取 8,您必须键入 df[2,3],因为它是第 2 行第 3 列中的元素。

现在关于你的例子。您的第一次尝试 (df[df$x <= 2, ,]) 选择所有行,其中 df$x 中的值小于二(我假设这正是您想要的)。第二个逗号不是必需的,您也可以写 df[df$x <= 2,]。第二个逗号起作用的原因是您可以将其他参数传递给 [ 函数,您可以在第二个逗号之后添加。

您的其他尝试 (df[,df$x <= 2,]) 不会导致错误,因为您的数据框恰好具有相同的行数和列数。那么会发生什么:

df$x <= 2实际上returns向量c(TRUE, TRUE, FALSE),因为df$x的前两个值是1和2,使得条件为真,而第三个元素为 3,则条件失败。如果您现在键入 df[df$x <= 2,],您将获得数据框的第一行和第二行,因为您在第一个索引中进行选择,该索引用于行。另一方面,如果您键入 df[,df$x <= 2],您将获得数据框的第一列和第二列,因为第二个索引选择列。

重要的一点是,df$x <= 2 返回的布尔向量不知道它是通过 运行 对数据框的行的条件获得的。它只是一个包含三个元素的向量,可以在任何需要包含三个元素的向量的地方使用。这样使用同一个向量索引行或列是没有问题的,只要行数和列数都是三。