Data.table проти кадру даних у 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 приблизно в 10 разів швидше імпортує цей файл CSV порівняно з функцією 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.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:
Як додати рядки до кадру даних у R
Як зберегти певні стовпці в R
Як вибрати лише числові стовпці в R