Ci stavo lavorando oggi per un data.frame (in realtà un data.table) con milioni di osservazioni e 35 colonne. Il mio obiettivo era restituire un elenco di data.frames (data.tables) ciascuno con una singola riga. Cioè, volevo dividere ogni riga in un data.frame separato e memorizzarli in un elenco.
Ecco due metodi che ho escogitato che erano circa 3 volte più veloci rispetto split(dat, seq_len(nrow(dat)))
a quel set di dati. Di seguito, ho confrontato i tre metodi su un set di dati di 7500 righe e 5 colonne ( iris ripetuto 50 volte).
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
)
Questo ritorna
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
Sebbene le differenze non siano così grandi come nel mio test precedente, il setDF
metodo diretto è significativamente più veloce a tutti i livelli della distribuzione delle corse con max (setDF) <min (split) e il attr
metodo è in genere più del doppio più veloce.
Un quarto metodo è il campione estremo, che è un semplice nidificato lapply
, che restituisce un elenco nidificato. Questo metodo esemplifica il costo di costruzione di un data.frame da un elenco. Inoltre, tutti i metodi che ho provato con la data.frame
funzione erano all'incirca un ordine di grandezza più lenti delle data.table
tecniche.
dati
dat <- vector("list", 50)
for(i in 1:50) dat[[i]] <- iris
dat <- setDF(rbindlist(dat))
split
ogni elemento, ha il tipodata.frame with 1 rows and N columns
invece dilist of length N