Подтвердить что ты не робот

Как извлечь один столбец из data.frame в качестве 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

Я не понимаю, почему он так себя ведет. На мой взгляд, не должно иметь значения, если я извлеку один, два или десять столбцов. Он должен либо всегда возвращать вектор (или матрицу), либо всегда возвращать data.frame (с правильными именами). что мне не хватает? Спасибо!

Примечание. Это не дублирует вопрос о матрицах, так как matrix и data.frame - это принципиально разные типы данных в R и могут по-разному работать с dplyr. Есть несколько ответов, которые работают с data.frame, но не с матрицей.

4b9b3361

Ответ 1

Используйте drop=FALSE

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

Из документации (см. ?"[") вы можете найти:

Если drop = TRUE, результат принуждается к минимально возможному размеру.

Ответ 2

Опустите ,:

x <- df[1]

   A
1 10
2 20
3 30

На странице справки ?"[":

Индексация по [похожа на атомные векторы и выбирает список указанных элементов).

Кадр данных представляет собой список. Столбцы - это его элементы.