การเพิ่มและอัปเดตคอลัมน์โดยอ้างอิง

การจัดการข้อมูลด้วย data.table ใน R

Matt Dowle, Arun Srinivasan

Instructors, DataCamp

การทำงานภายใน data.frame

สมมติว่าต้องการเปลี่ยนค่าแถวที่ 2 ของคอลัมน์ "y" เป็น 10

df <- data.frame(x = 1:5, y = 6:10)
df
x  y
1  6
2  7
df$y[2] <- 10
การจัดการข้อมูลด้วย data.table ใน R

การทำงานภายใน data.frame

ใน R เวอร์ชันก่อน 3.1.0 การดำเนินการนี้จะคัดลอก data.frame ทั้งหมดแบบ deep copy

# what happens internally prior to R v3.1.0
tmp <- <deep copy of "df">
tmp$y[2] <- 10
df <- tmp
  • จะเกิดอะไรขึ้นหากต้องทำแบบเดียวกันกับ data.frame ขนาด 10GB?
การจัดการข้อมูลด้วย data.table ใน R

การทำงานภายใน data.frame

  • ใน v3.1.0 มีการปรับปรุงให้ deep copy เฉพาะคอลัมน์ที่ถูกอัปเดต เท่านั้น

  • ในกรณีนี้ คอลัมน์ a และ b เท่านั้นที่ถูก deep copy ในการดำเนินการกับ df ด้านล่าง

df <- data.frame(a = 1:3, b = 4:6, c = 7:9, d = 10:12)
df[1:2] <- lapply(df[1:2], function(x) ifelse(x%%2, x, NA))
df
 a  b c  d
 1 NA 7 10
NA  5 8 11
 3 NA 9 12
การจัดการข้อมูลด้วย data.table ใน R

การทำงานภายใน data.table

  • data.table อัปเดตคอลัมน์ ในตำแหน่งเดิม นั่นคือ อ้างอิงโดยตรง

  • ไม่จำเป็นต้องกำหนดผลลัพธ์กลับไปยังตัวแปร

  • ไม่มีการคัดลอกคอลัมน์ใดเลยระหว่างการเปลี่ยนค่า

  • data.table ใช้ตัวดำเนินการใหม่ := เพื่อเพิ่ม/อัปเดต/ลบคอลัมน์ โดยอ้างอิง

การจัดการข้อมูลด้วย data.table ใน R

รูปแบบ LHS := RHS

batrips[, c("is_dur_gt_1hour", "week_day") := list(duration > 3600, 
                                                   wday(start_date))]

# When adding a single column quotes aren't necessary batrips[, is_dur_gt_1hour := duration > 3600]
การจัดการข้อมูลด้วย data.table ใน R

รูปแบบ Functional

batrips[, `:=`(is_dur_gt_1hour = NULL,                  
               start_station = toupper(start_station))] 
การจัดการข้อมูลด้วย data.table ใน R

มาฝึกกันเถอะ!

การจัดการข้อมูลด้วย data.table ใน R

Preparing Video For Download...