web-dev-qa-db-fra.com

Comment extraire une seule colonne d'un data.frame en tant que data.frame?

Disons que j'ai un 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

Si je sélectionne deux (ou plus) colonnes, j'obtiens un data.frame:

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

C'est ce que je veux. Cependant, si je sélectionne une seule colonne, j'obtiens un vecteur numérique:

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

J'ai essayé d'utiliser as.data.frame (), ce qui ne change pas les résultats pour deux colonnes ou plus. il renvoie un data.frame dans le cas d'une colonne, mais ne conserve pas le nom de la colonne:

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

Je ne comprends pas pourquoi ça se comporte comme ça. Dans mon esprit, cela ne devrait pas faire de différence si j'extrait une, deux ou dix colonnes. Le service informatique doit toujours renvoyer un vecteur (ou une matrice) ou toujours renvoyer un data.frame (avec les noms corrects). Qu'est-ce que je rate? Merci!

Remarque: Ce n'est pas un double de la question sur les matrices, car matrice et data.frame sont des types de données fondamentalement différents dans R, et peuvent fonctionner différemment avec dplyr. Il existe plusieurs réponses qui fonctionnent avec data.frame mais pas avec matrix.

35
rs028

Utilisation drop=FALSE

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

À partir de la documentation (voir ?"[" ) vous pouvez trouver:

Si drop = TRUE, le résultat est contraint à la dimension la plus basse possible.

71
Jilber Urbina

Omettez le ,:

x <- df[1]

   A
1 10
2 20
3 30

Depuis la page d'aide de ?"[":

L'indexation par [est similaire aux vecteurs atomiques et sélectionne une liste des éléments spécifiés.

Un bloc de données est une liste. Les colonnes sont ses éléments.

22
Sven Hohenstein