通过[]对数据帧进行子集化

时间:2015-03-14 09:17:20

标签: r dataframe subset

我有一个名为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&lt; = 2,]会给出错误。但是控制台向我展示了上面的输出。有没有人解释为什么它显示输出和输出是什么意思?

由于

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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