ฉันควรใช้โอเปอเรเตอร์: = ใน data.table เมื่อใด


88

data.tableตอนนี้วัตถุมีตัวดำเนินการ: = อะไรทำให้ตัวดำเนินการนี้แตกต่างจากตัวดำเนินการกำหนดอื่น ๆ ทั้งหมด นอกจากนี้การใช้งานคืออะไรเร็วแค่ไหนและควรหลีกเลี่ยงเมื่อใด

คำตอบ:


95

นี่คือตัวอย่างที่แสดงให้เห็นว่า 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

27
ขอขอบคุณที่พัฒนาแพ็คเกจนี้ ฉันรู้สึกว่าฉันกำลังจะแก้ไขโค้ดจำนวนมากเพื่อใช้แพ็คเกจนี้
Iterator

1
ในการแชทฉันถูกขอให้ถาม / ตอบด้วยตนเอง (ซึ่งเห็นได้ชัดว่าได้รับการสนับสนุน ) - คำถามนั้นอยู่ที่นี่
Matt Dowle

4
@MatthewDowle ต้องการรวมคำอธิบายเมื่อไม่ใช้: = และใช้ set () แทนหรือไม่?
Ari B. Friedman

2
@MatthewDowle ฉันจะ +1 อีกครั้งถ้าทำได้
Ari B. Friedman

3
@jabberwocky ไม่มีปัญหา set(DT, i, "V1", i)ตั้งค่า"V1"คอลัมน์ในขณะที่set(DT, i, colVar, i)ตั้งชื่อคอลัมน์ที่มีอยู่ในcolVarตัวแปร (เช่นถ้าcolVar = "V1"ทำก่อนหน้านี้) เครื่องหมายคำพูดระบุให้ใช้ชื่อคอลัมน์ตามตัวอักษรแทนที่จะค้นหาตัวแปร
Matt Dowle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.