data.table
ตอนนี้วัตถุมีตัวดำเนินการ: = อะไรทำให้ตัวดำเนินการนี้แตกต่างจากตัวดำเนินการกำหนดอื่น ๆ ทั้งหมด นอกจากนี้การใช้งานคืออะไรเร็วแค่ไหนและควรหลีกเลี่ยงเมื่อใด
data.table
ตอนนี้วัตถุมีตัวดำเนินการ: = อะไรทำให้ตัวดำเนินการนี้แตกต่างจากตัวดำเนินการกำหนดอื่น ๆ ทั้งหมด นอกจากนี้การใช้งานคืออะไรเร็วแค่ไหนและควรหลีกเลี่ยงเมื่อใด
คำตอบ:
นี่คือตัวอย่างที่แสดงให้เห็นว่า 10 นาทีลดลงเหลือ 1 วินาที (จาก NEWS ในหน้าแรก ) เหมือนกับการมอบหมายย่อยให้data.frame
แต่ไม่ได้คัดลอกทั้งตารางในแต่ละครั้ง
m = matrix(1,nrow=100000,ncol=100)
DF = as.data.frame(m)
DT = as.data.table(m)
system.time(for (i in 1:1000) DF[i,1] <- i)
user system elapsed
287.062 302.627 591.984
system.time(for (i in 1:1000) DT[i,V1:=i])
user system elapsed
1.148 0.000 1.158 ( 511 times faster )
วาง:=
ในj
เช่นที่ช่วยให้สำนวนเพิ่มเติมได้ที่:
DT["a",done:=TRUE] # binary search for group 'a' and set a flag
DT[,newcol:=42] # add a new column by reference (no copy of existing data)
DT[,col:=NULL] # remove a column by reference
และ:
DT[,newcol:=sum(v),by=group] # like a fast transform() by group
คิดไม่ออกว่าจะหลีกเลี่ยงเหตุผลใด:=
! นอกเหนือจากภายในfor
ลูป เนื่องจาก:=
ปรากฏภายในDT[...]
จึงมาพร้อมกับค่าใช้จ่ายเล็กน้อยของ[.data.table
วิธีการ เช่น S3 การจัดส่งและการตรวจสอบสำหรับการแสดงตนและประเภทของการขัดแย้งเช่นi
, by
, nomatch
ฯลฯ ดังนั้นสำหรับภายในfor
ลูปมีค่าใช้จ่ายต่ำ, รุ่นโดยตรงจากการที่เรียกว่า:=
set
ดู?set
รายละเอียดเพิ่มเติมและตัวอย่าง ข้อเสียของการset
รวมที่i
ต้องเป็นหมายเลขแถว (ไม่มีการค้นหาแบบไบนารี) และคุณไม่สามารถรวมเข้าด้วยby
กันได้ การกำหนดข้อ จำกัด เหล่านี้set
สามารถลดค่าใช้จ่ายได้อย่างมาก
system.time(for (i in 1:1000) set(DT,i,"V1",i))
user system elapsed
0.016 0.000 0.018
set(DT, i, "V1", i)
ตั้งค่า"V1"
คอลัมน์ในขณะที่set(DT, i, colVar, i)
ตั้งชื่อคอลัมน์ที่มีอยู่ในcolVar
ตัวแปร (เช่นถ้าcolVar = "V1"
ทำก่อนหน้านี้) เครื่องหมายคำพูดระบุให้ใช้ชื่อคอลัมน์ตามตัวอักษรแทนที่จะค้นหาตัวแปร