2011-10-06 17 views
5

Supongamos que queremos acceder a los datos de un marco de datos por fila. Los ejemplos están simplificados, pero al pedir un marco de datos por nombres de fila, por ejemplo, (df[order(row.names(df)]) usamos la misma técnica.En R, ¿por qué la selección de filas de un marco de datos devuelve datos como un vector si el marco de datos tiene solo una columna?

Si la trama de datos tiene una columna, que volver un vector atómica:

> df 
    x1 
a x 
b y 
c z 

> df[1, ] # returns atomic vector 
[1] x 

Si la trama de datos tiene dos columnas, que volver a una trama de datos de 1 fila que incluye el nombre de la fila:

> df 
    x1 x2 
a x u 
b y v 
c z w 

> df[1, ] # returns data frame 
    X1 X2 
a x u 

No entiendo por qué la misma operación en el marco de datos produce dos tipos de resultados según la cantidad de columnas que tenga el marco.

+0

preguntas idénticas: http://stackoverflow.com/q/7598674/602276 y http: // stackoverflow.com/q/7352254/602276 – Andrie

Respuesta

11

Se debe a que el argumento predeterminado para [ es drop=TRUE.

De ?"["

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 elementos de extracción, no para el reemplazo. Vea soltar para obtener más detalles sobre .

> dat1 <- data.frame(x=letters[1:3]) 
> dat2 <- data.frame(x=letters[1:3], y=LETTERS[1:3]) 

El comportamiento por defecto:

> dat[1, ] 
    row sessionId scenarionName stepName duration 
[1,] 1  1001    A start  0 

> dat[2, ] 
    row sessionId scenarionName stepName duration 
[1,] 2  1001    A step1  2.2 

Usando drop=FALSE:

> dat1[1, , drop=FALSE] 
    x 
1 a 

> dat2[1, , drop=FALSE] 
    x y 
1 a A 
+10

Esto es 'The R Inferno' Circle 8.1.45 http://www.burns-stat.com/pages/Tutor/R_inferno.pdf –

Cuestiones relacionadas