我有一个名为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,]会给出错误。但是控制台向我展示了上面的输出。有没有人解释为什么它显示输出和输出是什么意思?
由于
答案 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,使用相同的向量来索引行或列就没有问题。