2010-10-27 57 views
11

Tôi tương đối mới với R, và đã tự hỏi cách hiệu quả nhất để lặp lại xây dựng một khung dữ liệu (một hàng tại một thời điểm, số lần lặp "n" và độ dài của mỗi hàng "l "được biết trước).xây dựng lặp lại dataframe trong R

  1. Tạo dataframe trống rỗng, thêm một hàng mỗi lần lặp
  2. preallocate dataframe NXL, sửa đổi liên tiếp mỗi lần lặp
  3. preallocate ma trận NXL, sửa đổi liên tiếp mỗi lần lặp, hãy dataframe từ ma trận
  4. Cái gì khác
+0

Có một cần một toa thuốc cho Rx? –

+0

@Dirk: Rx _is_ toa thuốc. :) –

+1

'ma trận' có thể chứa một loại dữ liệu,' data.frame' có thể kết hợp các loại (ký tự, số, ngày, v.v.). Làm thế nào trong trường hợp của bạn? – Marek

Trả lời

15

Phân bổ trước !!!

Và sử dụng matrix nếu dữ liệu cùng loại. Nó sẽ nhanh hơn nhiều so với data.frame.

Ví dụ:

> 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

Phiên bản cuối cùng cần một dữ liệu 'Dữ liệu <- as.data.frame (Dữ liệu)' sau vòng lặp 'for' để đưa nó trở lại OPs yêu cầu khung dữ liệu. Không ảnh hưởng đến thời gian mặc dù - câu trả lời hay! Tôi biết dfs đã chậm nhưng nó là minh họa để xem làm thế nào chậm trong một trường hợp đơn giản như vậy! –

+0

@ucfagls: bắt tốt. –

1

Làm thế nào về tiền phân bổ với bất cứ loại cột bạn cần từ một danh sách đầu tiên?

as.data.frame (danh sách (a1 = vector ("số", n), a2 = vector ("nhân vật", n)))

+0

Đó chắc chắn là một ý tưởng hay nếu bạn thay thế từng phần tử. Tôi không chắc liệu bạn có được hưởng lợi khi bạn thay thế toàn bộ hàng hay không. –

Các vấn đề liên quan