Bởi v1.9.2
, rbindlist
đã phát triển khá nhiều, thực hiện nhiều tính năng bao gồm:
- Chọn
SEXPTYPE
cột cao nhất trong khi ràng buộc - được thực hiện v1.9.2
khi đóng FR # 2456 và Bug # 4981 .
- Xử lý
factor
các cột đúng cách - lần đầu tiên được thực hiện trong v1.8.10
việc đóng Bug # 2650 và mở rộng để ràng buộc các yếu tố theo thứ tự một cách cẩn thận v1.9.2
, đóng FR # 4856 và Bug # 5019 .
Ngoài ra, trong v1.9.2
, rbind.data.table
cũng có được một fill
đối số, cho phép liên kết bằng cách điền vào các cột bị thiếu, được triển khai trong R.
Bây giờ trong v1.9.3
, thậm chí còn có nhiều cải tiến hơn về các tính năng hiện có này:
rbindlist
đạt được một cuộc tranh luận use.names
, theo mặc định là FALSE
để tương thích ngược.
rbindlist
cũng đạt được một đối số fill
, theo mặc định cũng là FALSE
để tương thích ngược.
- Các tính năng này đều được triển khai trong C và được viết cẩn thận để không ảnh hưởng đến tốc độ trong khi thêm các chức năng.
- Vì
rbindlist
bây giờ có thể khớp với tên và điền vào các cột bị thiếu, rbind.data.table
chỉ cần gọi rbindlist
ngay bây giờ. Sự khác biệt duy nhất là use.names=TRUE
theo mặc định cho rbind.data.table
, để tương thích ngược.
rbind.data.frame
làm chậm khá nhiều chủ yếu là do các bản sao (mà @mnel cũng chỉ ra) có thể tránh được (bằng cách chuyển sang C). Tôi nghĩ đó không phải là lý do duy nhất. Việc thực hiện để kiểm tra / khớp tên cột trongrbind.data.frame
cũng có thể chậm hơn khi có nhiều cột trên mỗi data.frame và có nhiều data.frames như vậy để liên kết (như được hiển thị trong điểm chuẩn bên dưới).
Tuy nhiên, việc rbindlist
thiếu (ed) một số tính năng nhất định (như kiểm tra mức độ yếu tố hoặc tên trùng khớp) có trọng lượng rất nhỏ (hoặc không) đối với nó nhanh hơn rbind.data.frame
. Đó là bởi vì chúng được thực hiện cẩn thận trong C, được tối ưu hóa cho tốc độ và bộ nhớ.
Dưới đây là một chuẩn mực mà nổi bật hiệu quả ràng buộc trong khi ghép các bằng tên cột cũng sử dụng rbindlist
của use.names
tính năng từv1.9.3
. Tập dữ liệu bao gồm 10000 data.frames mỗi kích thước 10 * 500.
NB: điểm chuẩn này đã được cập nhật để bao gồm một so sánh để dplyr
'sbind_rows
library(data.table) # 1.11.5, 2018-06-02 00:09:06 UTC
library(dplyr) # 0.7.5.9000, 2018-06-12 01:41:40 UTC
set.seed(1L)
names = paste0("V", 1:500)
cols = 500L
foo <- function() {
data = as.data.frame(setDT(lapply(1:cols, function(x) sample(10))))
setnames(data, sample(names))
}
n = 10e3L
ll = vector("list", n)
for (i in 1:n) {
.Call("Csetlistelt", ll, i, foo())
}
system.time(ans1 <- rbindlist(ll))
# user system elapsed
# 1.226 0.070 1.296
system.time(ans2 <- rbindlist(ll, use.names=TRUE))
# user system elapsed
# 2.635 0.129 2.772
system.time(ans3 <- do.call("rbind", ll))
# user system elapsed
# 36.932 1.628 38.594
system.time(ans4 <- bind_rows(ll))
# user system elapsed
# 48.754 0.384 49.224
identical(ans2, setDT(ans3))
# [1] TRUE
identical(ans2, setDT(ans4))
# [1] TRUE
Các cột liên kết như vậy mà không cần kiểm tra tên chỉ mất 1,3 trong khi kiểm tra tên cột và ràng buộc một cách thích hợp chỉ mất 1,5 giây nữa. So với giải pháp cơ bản, tốc độ này nhanh hơn 14 lần và nhanh hơn 18 lần so với dplyr
phiên bản.
attr<-
,class<-
và (tôi nghĩ)rownames<-
tất cả sửa đổi tại chỗ.