2012-08-23 19 views
6

Estoy intentando filtrar marcos de datos que tienen solo una columna. El resultado es un vector que vaya a devolver, así:Filtrar tramas de datos de una sola columna

single.c <- data.frame(col1=c(1,2,3,4,5), row.names=C("r1","r2","r3","r4","r5")) 
single.c[single.c$col1 > 2,] 

[1] 3 4 5 

Lo que realmente quiero es los datos devueltos como lo es para tramas de datos de varias columnas:

multi.c <- data.frame(col1=c(1,2,3,4,5), col2=c(1,2,3,4,5), row.names=c("r1","r2","r3","r4","r5")) 
multi.c[multi.c$col2 > 2,] 

    col1 col2 
r3 3 3 
r4 4 4 
r5 5 5 

puedo ver que tiene sentido devolver una vector si no hay otras columnas, pero en general quiero ver qué filas han dado ese resultado también. ¿Por qué sucede esto, y hay una forma fácil de mantener la forma del marco de datos en el resultado, incluidos los nombres de fila?

Respuesta

10

utilizar el argumento drop a las funciones de selección:

single.c[single.c$col1 > 2, ,drop=F] 

# col1 
#r3 3 
#r4 4 
#r5 5 

De la documentación para [:

gota

Para matrices y matrices. Si es VERDADERO, el resultado se fuerza a la dimensión más baja posible (vea los ejemplos). Esto solo funciona para extraer elementos , no para reemplazarlos. Ver drop para más detalles.

+3

Gracias, no tenía idea de que había documentación listada bajo '? '[''! – MattLBeck

+2

¡Cosas geniales! Siempre me he preguntado cómo obtener un data.frame extrayendo una sola columna de un data.frame existente. He estado usando data.frame (col1 = multi.col $ col1, row.names = rownames (multi.col)) para hacer lo mismo. Doh! –

Cuestiones relacionadas