如何从 data.frame 中提取一列作为 data.frame?

假设我有一个数据:

df <- data.frame(A=c(10,20,30),B=c(11,22,33), C=c(111,222,333))
A  B  C
1 10 11 111
2 20 22 222
3 30 33 333

如果我选择两个(或更多)列,就会得到一个 data.frame:

x <- df[,1:2]
A  B
1 10 11
2 20 22
3 30 33

这就是我想要的,但是,如果我只选择一列,我就会得到一个数值向量:

x <- df[,1]
[1] 1 2 3

我尝试使用 as.data.frame () ,它不会更改两个或多个列的结果。对于一个列,它返回一个 data.frame,但不保留列名:

x <- as.data.frame(df[,1])
df[, 1]
1       1
2       2
3       3

我不明白为什么会这样。在我看来,如果我提取一个或两个或十个列,应该没有什么不同。IT 应该始终返回一个向量(或矩阵)或始终返回一个 data.frame (使用正确的名称)。我错过了什么?谢谢!

注意: 这不是关于矩阵的问题的重复,因为在 R 中,Matrix 和 data.frame 是完全不同的数据类型,并且可以与 dplyr 不同地工作。有几个答案适用于 data.frame,但不适用于矩阵。

120667 次浏览

使用 drop=FALSE

> x <- df[,1, drop=FALSE]
> x
A
1 10
2 20
3 30

从文档中(参见 ?"[")你可以找到:

如果 drop = TRUE,则结果被强制到可能的最低维度。

省略 ,:

x <- df[1]


A
1 10
2 20
3 30

来自 ?"["的帮助页面:

通过[建立索引类似于原子向量,并选择指定元素的列表。

数据框架是一个列表。列是它的元素。

你也可以使用 subset:

subset(df, select = 1) # by index
subset(df, select = A) # by name

正如注释中提到的,您也可以使用 dplyr::select,但是不需要引用变量名:

library(dplyr)


# by name
df %>%
select(A)


# by index
df %>%
select(1)