2010-10-27 18 views
11

Jestem względnie nowa dla R i zastanawiałam się, najefektywniejszej metody iteracyjnego konstruowania ramki danych (jeden wiersz na raz, liczba iteracji "n" i długość każdego wiersza "l" "są znane wcześniej).iteracyjnie skonstruowana ramka danych w R

  1. tworzyć puste dataframe, dodać wiersz każdej iteracji
  2. przydzielenia NXL dataframe, modyfikować z rzędu każdej iteracji
  3. przydzielenia NXL macierzy modyfikować z rzędu każdej iteracji, aby dataframe z matrycy
  4. coś innego
+0

Czy jeden potrzebna jest recepta dla RX? –

+0

@Dirk: Rx _jest_ receptą. :) –

+1

'matrix' może przechowywać jeden typ danych,' data.frame' może mieszać typy (znaki, liczby, daty itp.). Jak w twoim przypadku? – Marek

Odpowiedz

15

Wstępnie przydzielić !!!

I użyj matrix, jeśli dane są tego samego typu. Będzie znacznie szybszy niż data.frame.

Na przykład:

> 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

Ostatnia wersja potrzebuje 'Data <- as.data.frame (Data)' po pętli 'for', aby ją przywrócić do OP wymagają ramki danych. Nie wpływa to jednak na czasy - dobra odpowiedź! Wiedziałem, że dfs były powolne, ale jest to ilustracja, aby zobaczyć, jak powolny jest w tak prostym przypadku! –

+0

@ucfagls: dobry połów. –

1

Jak o pre-alokacji z cokolwiek kolumna typy trzeba z pierwszej listy?

as.data.frame (lista (a1 = wektorowe ("numeryczne", n), ("charakter" a2 = wektor, n)))

+0

To z pewnością dobry pomysł, jeśli zastępujesz element po elemencie. Nie jestem pewien, czy skorzystasz na wymianie całych rzędów. –

Powiązane problemy