2010-10-27 41 views
11

Je suis relativement nouveau à R, et je me demandais la manière la plus efficace de construire itérativement une trame de données (une rangée à la fois, le nombre d'itérations "n" et la longueur de chaque rangée "l "sont connus à l'avance).dataframe construit itérativement dans R

  1. Créer vide dataframe, ajoutez une ligne chaque itération
  2. Préallouer nxl dataframe, modifier une ligne chaque itération
  3. Préallouer matrice nxl, modifier une ligne chaque itération, faire dataframe de la matrice
  4. Quelque chose d'autre
+0

At-on besoin d'une prescription pour Rx? –

+0

@Dirk: Rx _is_ la prescription. :) –

+1

'matrix' peut contenir un type de données,' data.frame' peut mélanger des types (caractères, nombres, dates, etc.). Comment dans votre cas? – Marek

Répondre

15

Pré-allouer !!!

Et d'utiliser un matrix si les données sont tous du même type. Ce sera beaucoup plus rapide qu'un data.frame.

Par exemple:

> 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 dernière version a besoin d'un 'Data <- as.data.frame (Data)' après que la boucle 'for' soit retournée aux OP, cela nécessite une trame de données. Cela n'affecte pas les horaires - bonne réponse! Je savais que les dfs étaient lents mais il est illustratif de voir combien lent dans un cas si simple! –

+0

@ucfagls: bonne prise. –

1

Que diriez-vous de pré-allocation avec ce type colonne dont vous avez besoin d'une première liste?

as.data.frame (liste (a1 = vecteur ("numérique", n), "caractère" a2 = vecteur (n)))

+0

C'est certainement une bonne idée si vous remplacez élément par élément. Je ne suis pas sûr si vous bénéficieriez lorsque vous remplacez des lignes entières. –