ตามv1.9.2
, rbindlist
มีวิวัฒนาการไม่น้อยใช้คุณลักษณะหลายอย่างรวมถึง:
- เลือกสูงสุด
SEXPTYPE
ของคอลัมน์ในขณะที่มีผลผูกพัน - การดำเนินการในv1.9.2
การปิดFR # 2456และbug #
- การจัดการ
factor
คอลัมน์ถูกต้อง - ใช้เป็นครั้งแรกในv1.8.10
การปิดbug # 2650และขยายไปยังผูกพันสั่งซื้อปัจจัยอย่างรอบคอบv1.9.2
เป็นอย่างดีปิดFR # 4856และbug #
นอกจากนี้ในv1.9.2
, rbind.data.table
นอกจากนี้ยังได้รับfill
การโต้เถียงที่ช่วยให้การผูกโดยการกรอกข้อมูลคอลัมน์หายไปดำเนินการในอาร์
ในตอนนี้v1.9.3
มีการปรับปรุงคุณสมบัติที่มีอยู่เหล่านี้มากยิ่งขึ้น:
rbindlist
ได้รับอาร์กิวเมนต์use.names
ซึ่งโดยค่าเริ่มต้นFALSE
สำหรับความเข้ากันได้แบบย้อนกลับ
rbindlist
นอกจากนี้ยังได้รับอาร์กิวเมนต์fill
ซึ่งโดยค่าเริ่มต้นจะใช้FALSE
สำหรับความเข้ากันได้ย้อนหลัง
- คุณลักษณะเหล่านี้ใช้งานได้ทั้งหมดในภาษา C และเขียนอย่างระมัดระวังเพื่อไม่ให้ความเร็วลดลงในขณะที่เพิ่มฟังก์ชันการทำงาน
- เนื่องจาก
rbindlist
ตอนนี้สามารถจับคู่ตามชื่อและเติมคอลัมน์ที่ขาดหายไปrbind.data.table
เพียงโทรrbindlist
เลย ข้อแตกต่างเพียงอย่างเดียวคือuse.names=TRUE
โดยค่าเริ่มต้นrbind.data.table
สำหรับความเข้ากันได้แบบย้อนกลับ
rbind.data.frame
ช้าลงเล็กน้อยส่วนใหญ่เนื่องจากสำเนา (ซึ่ง @mnel ชี้ให้เห็นเช่นกัน) ที่สามารถหลีกเลี่ยงได้ (โดยย้ายไปที่ C) ฉันคิดว่านั่นไม่ใช่เหตุผลเดียว การใช้งานสำหรับการตรวจสอบ / การจับคู่ชื่อคอลัมน์ในrbind.data.frame
อาจช้าลงเมื่อมีหลายคอลัมน์ต่อ data.frame และมี data.frame จำนวนมากที่จะผูก (ดังแสดงในเกณฑ์มาตรฐานด้านล่าง)
แต่ที่rbindlist
ขาด (เอ็ด) คุณสมบัติบางอย่าง (เช่นการตรวจสอบระดับปัจจัยหรือตรงกับชื่อ) หมีขนาดเล็กมาก (หรือไม่) rbind.data.frame
น้ำหนักต่อมันเป็นเร็วกว่า เป็นเพราะพวกเขาถูกนำมาใช้อย่างระมัดระวังใน C ซึ่งปรับให้เหมาะสมกับความเร็วและหน่วยความจำ
นี่คือมาตรฐานที่ไฮไลท์ที่มีประสิทธิภาพมีผลผูกพันในขณะที่การจับคู่โดยชื่อคอลัมน์เช่นกันโดยใช้rbindlist
's คุณลักษณะจากuse.names
v1.9.3
ชุดข้อมูลประกอบด้วย 10,000 ข้อมูลแต่ละเฟรมขนาด 10 * 500
หมายเหตุ: เกณฑ์มาตรฐานนี้ได้รับการอัปเดตเพื่อรวมการเปรียบเทียบกับdplyr
'sbind_rows
library(data.table)
library(dplyr)
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))
system.time(ans2 <- rbindlist(ll, use.names=TRUE))
system.time(ans3 <- do.call("rbind", ll))
system.time(ans4 <- bind_rows(ll))
identical(ans2, setDT(ans3))
identical(ans2, setDT(ans4))
การผูกคอลัมน์โดยไม่ตรวจสอบชื่อใช้เวลาเพียง 1.3 ในขณะที่การตรวจสอบชื่อคอลัมน์และการเชื่อมโยงอย่างเหมาะสมใช้เวลาเพิ่มขึ้นเพียง 1.5 วินาที เมื่อเทียบกับโซลูชันพื้นฐานแล้วจะเร็วกว่า 14 เท่าและเร็วกว่าdplyr
เวอร์ชันของ18 เท่า
attr<-
,class<-
และ (ฉันคิด)rownames<-
ทั้งหมดปรับเปลี่ยนในสถานที่