2012-01-15 11 views
12

Me gustaría construir un marco de datos en un ciclo agregando una nueva columna cada vez usando cbind. Intento lo siguiente:expanda dinámicamente las columnas de un marco de datos usando cbind

test <- NULL 
df <- data.frame(x=c(1,2,3,4)) 
test <- cbind(test, df) 

Esto genera un error:

Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 0, 4 

¿Cuál es la forma correcta de crear una instancia de una trama de datos en blanco en R y luego unirse a él en un bucle?

Gracias

+2

Esto puede ser muy lento si tiene muchas columnas. Consulte el R Inferno para obtener algunos consejos de rendimiento http://www.burns-stat.com/pages/Tutor/R_inferno.pdf –

Respuesta

16

Se necesitan crear test como una estructura que tiene el mismo número de filas de manera que cbind.data.frame no generará un error:

test <-data.frame(row.names=1:4) 
df <- data.frame(x=c(1,2,3,4)) 
test <- cbind(test, df) 

test 
    x 
1 1 
2 2 
3 3 
4 4 

Otros dos métodos:

> test <-data.frame(row.names=1:4) 
>  test[['x']] <-c(1,2,3,4) 
> test 
    x 
1 1 
2 2 
3 3 
4 4 


> test <-data.frame(row.names=1:4) 
>  test[1] <-list(x=c(1,2,3,4)) 
> test 
    x 
1 1 
2 2 
3 3 
4 4 
+1

¿Qué sucede si las columnas tienen longitudes desiguales? ¿Cómo los mantienes alineados? ¿Te gustan las NA de los valores perdidos? – Pradeep

+0

En una palabra ... sí. Usted pad. –

11

Como señaló Roman Luštrik, puede ser ineficiente usar cbind. Puede comenzar con la lista vacía y luego convertirlo a data.frame.

test <- list() 
# inner loop assigment 
test <- c(test,list(c(1:4))) 
# after loop 
test <- as.data.frame(test) 
+0

gracias! eso es útil para mis propósitos ya que tengo un gran marco de datos – Alex

Cuestiones relacionadas