Saya mengerjakan ini hari ini untuk data.frame (benar-benar data.table) dengan jutaan observasi dan 35 kolom. Tujuan saya adalah mengembalikan daftar data.frames (data.tables) masing-masing dengan satu baris. Artinya, saya ingin membagi setiap baris menjadi data.frame terpisah dan menyimpannya dalam daftar.
Berikut adalah dua metode yang saya temukan yang kira-kira 3 kali lebih cepat daripada split(dat, seq_len(nrow(dat)))
untuk kumpulan data itu. Di bawah ini, saya membandingkan tiga metode pada 7500 baris, set data 5 kolom ( iris diulang 50 kali).
library(data.table)
library(microbenchmark)
microbenchmark(
split={dat1 <- split(dat, seq_len(nrow(dat)))},
setDF={dat2 <- lapply(seq_len(nrow(dat)),
function(i) setDF(lapply(dat, "[", i)))},
attrDT={dat3 <- lapply(seq_len(nrow(dat)),
function(i) {
tmp <- lapply(dat, "[", i)
attr(tmp, "class") <- c("data.table", "data.frame")
setDF(tmp)
})},
datList = {datL <- lapply(seq_len(nrow(dat)),
function(i) lapply(dat, "[", i))},
times=20
)
Ini kembali
Unit: milliseconds
expr min lq mean median uq max neval
split 861.8126 889.1849 973.5294 943.2288 1041.7206 1250.6150 20
setDF 459.0577 466.3432 511.2656 482.1943 500.6958 750.6635 20
attrDT 399.1999 409.6316 461.6454 422.5436 490.5620 717.6355 20
datList 192.1175 201.9896 241.4726 208.4535 246.4299 411.2097 20
Meskipun perbedaannya tidak sebesar pada pengujian saya sebelumnya, setDF
metode lurus secara signifikan lebih cepat di semua tingkat distribusi proses dengan max (setDF) <min (split) dan attr
metode ini biasanya lebih dari dua kali lebih cepat.
Metode keempat adalah juara ekstrem, yang merupakan metode bersarang sederhana lapply
, yang menampilkan daftar bersarang. Metode ini mencontohkan biaya pembuatan data.frame dari daftar. Selain itu, semua metode yang saya coba dengan data.frame
fungsi kira-kira urutan besarnya lebih lambat daripada data.table
teknik.
data
dat <- vector("list", 50)
for(i in 1:50) dat[[i]] <- iris
dat <- setDF(rbindlist(dat))
split
setiap elemen memiliki jenisdata.frame with 1 rows and N columns
alih-alihlist of length N