2010-10-27 16 views
11

Sono relativamente nuovo a R, e mi chiedevo il modo più efficiente per costruire iterativamente un dataframe (una riga alla volta, il numero di iterazioni "n" e la lunghezza di ogni riga "l "sono conosciuti in anticipo).dataframe iterativamente costruito in R

  1. Crea dataframe vuoto, aggiungere una riga ogni iterazione
  2. Prealloca dataframe nxl, modificare una riga ogni iterazione
  3. matrice nxl Prealloca, modificare una riga ogni iterazione, rendono dataframe dalla matrice
  4. qualcos'altro
+0

C'è bisogno di una prescrizione per Rx? –

+0

@Dirk: Rx _ è_ la prescrizione. :) –

+1

'matrix' può contenere un tipo di dati,' data.frame' può combinare tipi (caratteri, numeri, date, ecc.). Come nel tuo caso? – Marek

risposta

15

Pre-allocazione !!!

E utilizzare un matrix se i dati sono tutti dello stesso tipo. Sarà molto più veloce di un data.frame.

Ad esempio:

> 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

L'ultima versione ha bisogno di un 'Data <- as.data.frame (Data)' dopo che il ciclo 'for' per tornare agli OP richiede un frame di dati. Però non influisce sui tempi - bella risposta! Sapevo che i dfs erano lenti ma è illustrativo vedere quanto sia lento in un caso così semplice! –

+0

@ucfagls: buona cattura. –

1

Che ne dite di pre-assegnazione con qualunque tipo di colonna è necessario da una lista prima?

as.data.frame (lista (a1 = vettore ("numerico", n), a2 = vettore ("carattere", n)))

+0

Questa è certamente una buona idea se si sostituisce elemento per elemento. Non sono sicuro che ne trarrai vantaggio quando sostituirai intere righe. –

Problemi correlati