Tengo un marco de datos como:
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)
Intenté lo siguiente para convertir una de las columnas en un vector, pero no funciona:
avector <- as.vector(aframe['a2'])
class(avector)
[1] "data.frame"
Esta es la única solución que se me ocurre, pero supongo que tiene que haber una mejor manera de hacerlo:
class(aframe['a2'])
[1] "data.frame"
avector = c()
for(atmp in aframe['a2']) { avector <- atmp }
class(avector)
[1] "numeric"
Nota: Mi vocabulario anterior puede estar apagado, así que corrígeme si es así. Todavía estoy aprendiendo el mundo de R. Además, cualquier explicación de lo que está sucediendo aquí es apreciada (¡es decir, relacionarse con Python o algún otro idioma ayudaría!)
r
dataframe
vector
type-conversion
Dolan Antenucci
fuente
fuente
?'[.data.frame'
detallada de lo llevará muy lejos.Respuestas:
Intentaré explicar esto sin cometer errores, pero apuesto a que esto atraerá una aclaración o dos en los comentarios.
Un marco de datos es una lista. Cuando subconjusta un marco de datos usando el nombre de una columna y
[
, lo que obtienes es una sublista (o un sub marco de datos). Si desea la columna atómica real, podría usar[[
, o algo confuso (para mí) que podría hacer,aframe[,2]
que devuelve un vector, no una sublista.Intenta ejecutar esta secuencia y tal vez las cosas estén más claras:
fuente
aframe[,"a2"]
debido a la capacidad de usar esto tanto con marcos de datos como con matrices y parece que obtengo los mismos resultados: un vector.[..., drop = F]
siempre devolverá un marco de datosdf$x
sintaxis devuelve un vector. Utilicé esta sintaxis durante mucho tiempo, pero cuando tuve que comenzar a usardf['name']
odf[n]
recuperar columnas, tuve problemas cuando intenté enviarlas a funciones que esperaban vectores. Usardf[[n]]
odf[['x']]
aclarar las cosas de inmediato.as.vector
parece no tener ningún efecto en silencio? ¿No debería esto devolver un vector o fallar notablemente?aframe[['a2']]
es muy útil consf
objetos porqueaframe[,"a2"]
devolverá dos columnas porque se incluye la columna de geometría.Ahora hay una manera fácil de hacer esto usando
dplyr
.fuente
Puedes usar
$
extracción:o el corchete doble:
fuente
No es necesario
as.vector()
, pero sí necesita una indexación correcta:avector <- aframe[ , "a2"]
La otra cosa a tener en cuenta es la
drop=FALSE
opción de[
:fuente
drop=FALSE
es útil: esto me ayuda en los casos en que puedo seleccionar N columnas de un marco de datos, en aquellos casos en que N = 1.Otra ventaja de usar el operador '[[' 'es que funciona tanto con data.frame como con data.table. Entonces, si la función debe ejecutarse tanto para data.frame como para data.table, y desea extraer una columna de ella como un vector, entonces
es mejor.
fuente
Puedes probar algo como esto
fuente
identical
.Si solo usa el operador de extracción, funcionará. Por defecto, [] establece la opción
drop=TRUE
, que es lo que desea aquí. Ver?'['
para más detalles.fuente
fuente
fuente
Utilizo listas para filtrar marcos de datos según tengan o no un valor% en% una lista.
Había estado creando listas manualmente exportando un marco de datos de 1 columna a Excel donde agregaría "", alrededor de cada elemento, antes de pegar en R: list <- c ("el1", "el2", ...) que generalmente era seguido de FilteredData <- subconjunto (Datos, Columna% en la lista%).
Después de buscar stackoverflow y no encontrar una forma intuitiva de convertir un marco de datos de 1 columna en una lista, ahora estoy publicando mi primera contribución de stackoverflow:
fuente
También podemos convertir columnas data.frame genéricamente en un vector simple.
as.vector
no es suficiente ya que retiene la clase y la estructura data.frame, por lo que también tenemos que extraer el primer (y único) elemento:Todas las soluciones sugeridas hasta ahora requieren títulos de columna de codificación fija. Esto los hace no genéricos (imagine aplicar esto a los argumentos de la función).
Alternativamente, podría, por supuesto, leer primero los nombres de columna de la columna y luego insertarlos en el código en las otras soluciones.
fuente