data.table
คำถามของฉันจะเกี่ยวข้องกับการที่ได้รับมอบหมายโดยอ้างอิงกับการคัดลอกใน ฉันต้องการทราบว่าใครสามารถลบแถวโดยการอ้างอิงคล้ายกับ
DT[ , someCol := NULL]
ฉันต้องการรู้เกี่ยวกับ
DT[someRow := NULL, ]
ฉันคิดว่ามันมีเหตุผลที่ดีที่ฟังก์ชั่นนี้ไม่มีอยู่ดังนั้นบางทีคุณอาจชี้ให้เห็นถึงทางเลือกที่ดีสำหรับวิธีการคัดลอกตามปกติดังนี้ โดยเฉพาะอย่างยิ่งไปกับชื่นชอบจากตัวอย่าง (data.table)
DT = data.table(x = rep(c("a", "b", "c"), each = 3), y = c(1, 3, 6), v = 1:9)
# x y v
# [1,] a 1 1
# [2,] a 3 2
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9
ว่าฉันต้องการลบแถวแรกจาก data.table นี้ ฉันรู้ว่าฉันสามารถทำสิ่งนี้:
DT <- DT[-1, ]
แต่บ่อยครั้งที่เราอาจต้องการที่จะหลีกเลี่ยงเพราะเรากำลังคัดลอกวัตถุ (และที่ต้องใช้ประมาณ 3 * หน่วยความจำ N ถ้า N object.size(DT)
, เป็นแหลมออกจากที่นี่ตอนนี้ผมพบว่า. set(DT, i, j, value)
ฉันรู้วิธีการค่าเฉพาะชุด (เช่นที่นี่:. การตั้งค่าทั้งหมด ค่าในแถว 1 และ 2 และคอลัมน์ 2 และ 3 ถึงศูนย์)
set(DT, 1:2, 2:3, 0)
DT
# x y v
# [1,] a 0 0
# [2,] a 0 0
# [3,] a 6 3
# [4,] b 1 4
# [5,] b 3 5
# [6,] b 6 6
# [7,] c 1 7
# [8,] c 3 8
# [9,] c 6 9
แต่ฉันจะลบสองแถวแรกได้อย่างไรพูด? การทำ
set(DT, 1:2, 1:3, NULL)
ตั้งค่า DT ทั้งหมดเป็น NULL
ความรู้เกี่ยวกับ SQL ของฉันมี จำกัด มากดังนั้นคุณบอกฉัน: data.table ที่กำหนดใช้เทคโนโลยี SQL มีคำสั่ง SQL เทียบเท่าหรือไม่
DELETE FROM table_name
WHERE some_column=some_value
ใน data.table?
DT[ , keep := .I > 1]
จากนั้นชุดย่อยสำหรับการดำเนินงานในภายหลัง: DT[(keep), ...]
บางทีแม้แต่setindex(DT, keep)
ความเร็วของการย่อยนี้ ไม่ใช่ยาครอบจักรวาล แต่คุ้มค่าที่จะพิจารณาว่าเป็นตัวเลือกการออกแบบในเวิร์กโฟลว์ของคุณ - คุณต้องการลบแถวเหล่านั้นทั้งหมดออกจากหน่วยความจำหรือคุณต้องการแยกออกจากกันหรือไม่? คำตอบนั้นแตกต่างกันไปตามกรณีการใช้งาน
data.table()
ใช้เทคโนโลยี SQL มากเป็นหนึ่งสามารถวาดขนานระหว่างการดำเนินงานที่แตกต่างกันใน SQL และข้อโต้แย้งต่าง ๆdata.table
ไปยัง สำหรับฉันแล้วการอ้างอิงถึง "เทคโนโลยี" ค่อนข้างบอกเป็นนัยว่าdata.table
มันนั่งอยู่ด้านบนของฐานข้อมูล SQL ที่ไหนสักแห่งซึ่ง AFAIK ไม่ได้เป็นเช่นนั้น