Data.table กับ data frame ใน r: ความแตกต่างที่สำคัญสามประการ


ในภาษาการเขียนโปรแกรม R นั้น data.frame เป็นส่วนหนึ่งของฐานข้อมูล R

data.frame ใดๆ สามารถแปลงเป็น data.table ได้โดยใช้ฟังก์ชัน setDF ของแพ็คเกจ data.table

data.table มีข้อดีเหนือกว่า data.frame ใน R ดังต่อไปนี้:

1. คุณสามารถใช้ฟังก์ชัน fread จากแพ็คเกจ data.table เพื่ออ่านไฟล์ลงใน data.table ได้ เร็วกว่าฟังก์ชัน R พื้นฐาน เช่น read.csv ซึ่งอ่านไฟล์ลงใน data.frame

2. คุณสามารถดำเนินการต่างๆ (เช่น การจัดกลุ่มและการรวมกลุ่ม) บน data.table ได้เร็วกว่า data.frame มาก

3. เมื่อพิมพ์ data.frame ไปยังคอนโซล R จะพยายามพิมพ์แต่ละแถวใน data.frame อย่างไรก็ตาม data.table จะแสดงเฉพาะ 100 แถวแรกเท่านั้น ซึ่งอาจป้องกันไม่ให้เซสชันของคุณหยุดทำงานหรือหยุดทำงานหากคุณกำลังทำงานกับชุดข้อมูลขนาดใหญ่

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงความแตกต่างระหว่าง data.frames และ data.tables ในทางปฏิบัติ

ความแตกต่าง #1: นำเข้าได้เร็วขึ้นด้วย Fread

รหัสต่อไปนี้แสดงวิธีการนำเข้ากรอบข้อมูล 10,000 แถวและ 100 คอลัมน์โดยใช้ฟังก์ชัน fread จากแพ็คเกจ data.table และฟังก์ชัน read.csv จากฐานข้อมูล R:

 library (microbenchmark)
library (data.table)

#make this example reproducible
set. seeds (1)

#create data frame with 10,000 rows and 100 columns
df <- as. data . frame (matrix(runif(10^4 * 100), nrow = 10^4))

#export CSV to current working directory
write.write. csv (df, " test.csv ", quote = FALSE )

#import CSV file using fread and read.csv and time how long it takes
results <- microbenchmark(
  read.csv = read. csv (" test.csv ", header = TRUE , stringsAsFactors = FALSE ),
  fread = fread(" test.csv ", sep = ",", stringsAsFactors = FALSE ),
  times = 10)

#view results
results

Unit: milliseconds
     expr min lq mean median uq max neval cld
 read.csv 817.1867 892.8748 1026.7071 899.5755 926.9120 1964.0540 10 b
    fread 113.5889 116.2735 136.4079 124.3816 136.0534 211.7484 10 a

จากผลลัพธ์ เราจะเห็นว่า Fread นำเข้าไฟล์ CSV นี้เร็วกว่าประมาณ 10 เท่า เมื่อเทียบกับฟังก์ชัน read.csv

โปรดทราบว่าความแตกต่างนี้จะยิ่งใหญ่กว่าสำหรับชุดข้อมูลขนาดใหญ่

ความแตกต่าง #2: การจัดการข้อมูลที่เร็วขึ้นด้วย data.table

โดยทั่วไป data.table ยังสามารถดำเนินการจัดการข้อมูลได้เร็วกว่า data.frame มาก

ตัวอย่างเช่น รหัสต่อไปนี้แสดงวิธีคำนวณค่าเฉลี่ยของตัวแปร โดยจัดกลุ่มตามตัวแปรอื่นทั้งใน data.table และ data.frame:

 library (microbenchmark)
library (data.table)

#make this example reproducible
set.seed(1)

#create data frame with 10,000 rows and 100 columns
d_frame <- data. frame (team=rep(c(' A ', ' B '), each=5000),
                      points=c(rnorm(10000, mean=20, sd=3)))

#create data.table from data.frame
d_table <- setDT(d_frame)

#calculate mean of points grouped by team in data.frame and data.table
results <- microbenchmark(
  mean_d_frame = aggregate(d_frame$points, list(d_frame$team), FUN=mean),
  mean_d_table = d_table[ ,list(mean=mean(points)), by=team],
  times = 10)

#view results
results

Unit: milliseconds
         expr min lq mean median uq max neval cld
 mean_d_frame 2.9045 3.0077 3.11683 3.1074 3.1654 3.4824 10 b
 mean_d_table 1.0539 1.1140 1.52002 1.2075 1.2786 3.6084 10 a

จากผลลัพธ์ เราจะเห็นว่า data.table เร็วกว่า data.frame ประมาณสามเท่า

สำหรับชุดข้อมูลขนาดใหญ่ ความแตกต่างนี้จะยิ่งใหญ่ยิ่งขึ้น

ความแตกต่าง #3: แถวน้อยลงที่พิมพ์ด้วย data.table

เมื่อพิมพ์ data.frame ไปยังคอนโซล R จะพยายามพิมพ์แต่ละแถวใน data.frame

อย่างไรก็ตาม data.table จะแสดงเฉพาะ 100 แถวแรกเท่านั้น ซึ่งอาจป้องกันไม่ให้เซสชันของคุณหยุดทำงานหรือหยุดทำงานหากคุณกำลังทำงานกับชุดข้อมูลขนาดใหญ่

ตัวอย่างเช่น ในโค้ดต่อไปนี้ เราสร้างทั้ง data frame และ data.table จำนวน 200 แถว

เมื่อพิมพ์ data.frame R จะพยายามพิมพ์แต่ละแถวในขณะที่พิมพ์ data.table จะแสดงเฉพาะห้าแถวแรกและห้าแถวสุดท้าย:

 library (data.table)

#make this example reproducible
set. seeds (1)

#create data frame
d_frame <- data. frame (x=rnorm(200),
                      y=rnorm(200),
                      z=rnorm(200))
#view data frame
d_frame

               X Y Z
1 -0.055303118 1.54858564 -2.065337e-02
2 0.354143920 0.36706204 -3.743962e-01
3 -0.999823809 -1.57842544 4.392027e-01
4 2.586214840 0.17383147 -2.081125e+00
5 -1.917692199 -2.11487401 4.073522e-01
6 0.039614766 2.21644236 1.869164e+00
7 -1.942259548 0.81566443 4.740712e-01
8 -0.424913746 1.01081030 4.996065e-01
9 -1.753210825 -0.98893038 -6.290307e-01
10 0.232382655 -1.25229873 -1.324883e+00
11 0.027278832 0.44209325 -3.221920e-01
...
#create data table
d_table <- setDT(d_frame)

#view data table
d_table

               X Y Z
  1: -0.05530312 1.54858564 -0.02065337
  2: 0.35414392 0.36706204 -0.37439617
  3: -0.99982381 -1.57842544 0.43920275
  4: 2.58621484 0.17383147 -2.08112491
  5: -1.91769220 -2.11487401 0.40735218
 ---                                    
196: -0.06196178 1.08164065 0.58609090
197: 0.34160667 -0.01886703 1.61296255
198: -0.38361957 -0.03890329 0.71377217
199: -0.80719743 -0.89674205 -0.49615702
200: -0.26502679 -0.15887435 -1.73781026

นี่เป็นข้อได้เปรียบที่ data.table มีให้มากกว่า data.frame โดยเฉพาะอย่างยิ่งเมื่อทำงานกับชุดข้อมูลขนาดใหญ่ที่คุณไม่ต้องการพิมพ์ไปยังคอนโซลโดยไม่ตั้งใจ

แหล่งข้อมูลเพิ่มเติม

บทช่วยสอนต่อไปนี้จะอธิบายวิธีดำเนินการงานทั่วไปอื่นๆ ใน R:

วิธีเพิ่มแถวใน data frame ใน R
วิธีรักษาบางคอลัมน์ใน R
วิธีเลือกเฉพาะคอลัมน์ตัวเลขใน R

เพิ่มความคิดเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *