¿Cómo extraigo una sola columna de un data.frame como un data.frame?

Digamos que tengo un data.frame:

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

Si selecciono dos (o más) columnas obtengo un data.frame:

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

Esto es lo que quiero. Sin embargo, si selecciono solo una columna, obtengo un vector numérico:

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

He intentado usar as.data.frame (), que no cambia los resultados para dos o más columnas. devuelve un data.frame en el caso de una columna, pero no conserva el nombre de la columna:

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

No entiendo por qué se comporta así. En mi opinión, no debería hacer una diferencia si extraigo una, dos o diez columnas. TI debería siempre devolver un vector (o matriz) o siempre devolver un data.frame (con los nombres correctos). ¿Qué me estoy perdiendo? ¡Gracias!

Use drop=FALSE

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

De la documentación (vea ?"[" ) Puede encontrar:

Si drop = TRUE, el resultado se coacciona a la dimensión más baja posible.

Omitir el ,

 x <- df[1] A 1 10 2 20 3 30 

¿De la página de ayuda de ?"[" :

La indexación por [es similar a los vectores atómicos y selecciona una lista de los elementos especificados.

Un dataframe es una lista. Las columnas son sus elementos.