Tôi đã nhận thấy rằng cbind mất nhiều thời gian hơn đáng kể so với rbind cho data.tables. Lý do cho điều này là gì?cbind vs rbind với data.table
> dt <- as.data.table(mtcars)
> new.dt <- copy(dt)
> timeit({for (i in 1:100) dt.new <- rbind(dt.new, dt)})
user system elapsed
0.237 0.012 0.253
> new.dt <- copy(dt)
> timeit({for (i in 1:100) dt.new <- cbind(dt.new, dt)})
user system elapsed
14.795 0.090 14.912
timeit <- function(expr)
{
ptm <- proc.time()
expr
proc.time() - ptm
}
Tôi không biết bên trong của data.table, nhưng tôi đoán thêm kỷ lục mới (hàng) là dễ dàng hơn hơn là tái cơ cấu bảng với các biến mới (cột). – zx8754
@ zx8754 Có Tôi đồng ý với sự nghi ngờ của tôi nữa, tò mò về cổ chai cụ thể là gì. Có lẽ đó là sự phân bổ bộ nhớ, có thể yêu cầu bộ nhớ lớn hơn, hy vọng một người nào đó hài lòng với gritty nitty của gói có thể làm sáng tỏ .. – andrew
Trừ khi tôi bị nhầm lẫn, gọi 'rbind' trên' data.table' sẽ gửi 'rbind.data. table', gọi hàm 'data.table'' rbindlist'- được triển khai trong C và rất nhanh. Xem câu trả lời của @ Arun [tại đây] (http://stackoverflow.com/questions/15673550/why-is-rbindlist-better-than-rbind). Trên hết, hầu như chắc chắn có sự khác biệt cơ bản giữa sửa đổi cột khôn ngoan và sửa đổi hàng khôn ngoan (liên quan đến cách đối tượng được lưu trữ trong bộ nhớ), vì vậy đây không thực sự là so sánh "táo-to-táo". Nhiều khả năng đây là lý do tại sao 'data.table' thực hiện': = 'để sửa đổi các cột một cách hiệu quả. – nrussell