2011-08-15 19 views
93

que tienen una trama de datos tales como:R-friendly forma de convertir la columna R data.frame en un vector?

a1 = c(1, 2, 3, 4, 5) 
a2 = c(6, 7, 8, 9, 10) 
a3 = c(11, 12, 13, 14, 15) 
aframe = data.frame(a1, a2, a3) 

He intentado lo siguiente para convertir una de las columnas a un vector, pero no funciona:

avector <- as.vector(aframe['a2']) 
class(avector) 
[1] "data.frame" 

Esta es la única solución que se me podría llegar a, pero estoy suponiendo que tiene que haber una mejor manera de hacer esto:

class(aframe['a2']) 
[1] "data.frame" 
avector = c() 
for(atmp in aframe['a2']) { avector <- atmp } 
class(avector) 
[1] "numeric" 

Nota: Mi vocabular y arriba puede estar desactivado, así que por favor corrígeme si es así. Todavía estoy aprendiendo el mundo de R. Además, cualquier explicación de lo que está pasando aquí es apreciada (es decir, relacionado con Python o algún otro lenguaje ayudaría!)

+5

Como verá en las respuestas, una lectura detallada de '? '[. Data.frame'' le llevará muy lejos. – joran

+0

@joran: Creo que esta es la primera vez que me encuentro con ese archivo de ayuda en particular. ¡Gracias! Justo antes de mi plan para migrar a data.table. :) – Iterator

Respuesta

137

Voy a tratar de explicar esto sin hacer nada errores, pero apuesto a que esto atraerá una aclaración o dos en los comentarios.

Un marco de datos es una lista. Cuando subconjunta un marco de datos usando el nombre de una columna y [, lo que obtiene es una sublista (o un marco de datos secundario). Si desea la columna atómica real, puede usar [[, o de manera un tanto confusa (para mí) podría hacer aframe[,2] que devuelve un vector, no una sublista.

Así que trate de ejecutar esta secuencia y tal vez las cosas serán más claras:

avector <- as.vector(aframe['a2']) 
class(avector) 

avector <- aframe[['a2']] 
class(avector) 

avector <- aframe[,2] 
class(avector) 
+6

+1 Esto es útil. Me había acostumbrado a usar 'aframe [," a2 "]' debido a la capacidad de usar esto con marcos de datos y matrices y parece obtener los mismos resultados: un vector. – Iterator

+6

'[..., drop = F]' siempre devolverá un marco de datos – hadley

+1

Esto es particularmente bueno saberlo porque la sintaxis 'df $ x' devuelve un vector. Utilicé esta sintaxis durante mucho tiempo, pero cuando tuve que empezar a usar 'df ['name']' o 'df [n]' para recuperar columnas, accioné problemas cuando intenté enviarlos a las funciones que esperaban los vectores. El uso de 'df [[n]]' o 'df [['x']]' borró todo. – rensa

15

No es necesario as.vector(), pero sí es necesario indexación correcta: avector <- aframe[ , "a2"]

La otra cosa a tener en cuenta es drop=FALSE la opción de [:

R> aframe <- data.frame(a1=c1:5, a2=6:10, a3=11:15) 
R> aframe 
    a1 a2 a3 
1 1 6 11 
2 2 7 12 
3 3 8 13 
4 4 9 14 
5 5 10 15 
R> avector <- aframe[, "a2"] 
R> avector 
[1] 6 7 8 9 10 
R> avector <- aframe[, "a2", drop=FALSE] 
R> avector 
    a2 
1 6 
2 7 
3 8 
4 9 
5 10 
R> 
+4

+1: El recordatorio de 'drop = FALSE' es útil; esto me ayuda en los casos en que puedo seleccionar N columnas de un data.frame, en los casos en que N = 1. – Iterator

+0

Utilizo esto cuando no puedo prever el número de columnas seleccionadas y en caso de que aparezca una columna, el resultado aún se pasa como un data.frame con n columnas. Un vector puede lanzar una llave inglesa en las funciones de la línea. –

23

Usted podría utilizar $ extrac ción:

class(aframe$a1) 
[1] "numeric" 

o el corchete doble:

class(aframe[["a1"]]) 
[1] "numeric" 
4

Si sólo utiliza el operador de extracto que va a funcionar. Por defecto, [] establece la opción drop=TRUE, que es lo que quiere aquí. Vea ?'[' para más detalles.

> a1 = c(1, 2, 3, 4, 5) 
> a2 = c(6, 7, 8, 9, 10) 
> a3 = c(11, 12, 13, 14, 15) 
> aframe = data.frame(a1, a2, a3) 
> aframe[,'a2'] 
[1] 6 7 8 9 10 
> class(aframe[,'a2']) 
[1] "numeric" 
5

Otra ventaja de usar el operador '[[' es que funciona tanto con hoja.de.datos y data.table. Así que si la función tiene que ser hecho correr tanto para hoja.de.datos y data.table, y que desea extraer una columna de ella como un vector a continuación

data[["column_name"]] 

es mejor.

2
a1 = c(1, 2, 3, 4, 5) 
a2 = c(6, 7, 8, 9, 10) 
a3 = c(11, 12, 13, 14, 15) 
aframe = data.frame(a1, a2, a3) 
avector <- as.vector(aframe['a2']) 

avector<-unlist(avector) 
#this will return a vector of type "integer" 
2

Ahora hay una manera fácil de hacerlo usando dplyr.

dplyr::pull(aframe, a2) 
Cuestiones relacionadas