通过 [] 子集数据框
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
返回的布尔向量不知道它是通过 运行 对数据框的行的条件获得的。它只是一个包含三个元素的向量,可以在任何需要包含三个元素的向量的地方使用。这样使用同一个向量索引行或列是没有问题的,只要行数和列数都是三。
我有一个名为 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
返回的布尔向量不知道它是通过 运行 对数据框的行的条件获得的。它只是一个包含三个元素的向量,可以在任何需要包含三个元素的向量的地方使用。这样使用同一个向量索引行或列是没有问题的,只要行数和列数都是三。