2010-10-27 25 views
11

Soy relativamente nuevo en R, y me preguntaba la forma más eficiente de construir iterativamente un dataframe (una fila a la vez, el número de iteraciones "n" y la longitud de cada fila "l "son conocidos de antemano).dataframe iterativamente construido en R

  1. Crear trama de datos vacía, añadir una fila cada iteración
  2. trama de datos nxl asignar previamente, modificar una fila cada matriz nxl asignar previamente iteración
  3. , modificar una fila cada iteración, haga trama de datos de la matriz
  4. Algo más
+0

¿Se necesita una receta para Rx? –

+0

@Dirk: Rx _es_ la prescripción. :) –

+1

'matriz' puede contener un tipo de datos,' data.frame' puede mezclar tipos (caracteres, números, fechas, etc.). ¿Cómo en tu caso? – Marek

Respuesta

15

Preasignar !!!

Y use un matrix si los datos son todos del mismo tipo. Será mucho más rápido que data.frame.

Por ejemplo:

> n <- 1000  # Number of rows 
> row <- 1:20*1 # one row 
> 
> # Adding row, one-by-one 
> Data <- data.frame() 
> system.time(for(i in 1:n) Data <- rbind(Data,row)) 
    user system elapsed 
    2.18 0.00 2.18 
> 
> # Pre-allocated data.frame 
> Data <- as.data.frame(Data) 
> system.time(for(i in 1:n) Data[i,] <- row) 
    user system elapsed 
    0.94 0.00 0.93 
> 
> # Pre-allocated matrix (fast!) 
> Data <- as.matrix(Data) 
> system.time({ for(i in 1:n) Data[i,] <- row; Data <- as.data.frame(Data) }) 
    user system elapsed 
     0  0  0 
+0

La última versión necesita 'Datos <- as.data.frame (Datos)' después de que el bucle 'for' para volver a los PO requiere marco de datos. Sin embargo, no afecta los tiempos: ¡buena respuesta! Sabía que los dfs eran lentos, pero es ilustrativo ver lo lento en un caso tan simple. –

+0

@ucfagls: buena captura. –

1

¿Qué hay de pre-asignación con cualquier tipo de columna que necesita de una lista en primer lugar?

as.data.frame (lista (a1 = vector ("numérico", n), ("carácter" a2 = vector, n)))

+0

Eso es ciertamente una buena idea si está reemplazando elemento por elemento. No estoy seguro de si te beneficiarías si reemplazas filas enteras. –

Cuestiones relacionadas