Bugün bunun üzerinde milyonlarca gözlem ve 35 sütun içeren bir data.frame (gerçekten data.table) için çalışıyordum. Amacım, her biri tek bir satıra sahip olan data.frames (data.tables) listesini döndürmekti. Yani, her satırı ayrı bir data.frame'e bölmek ve bunları bir listede saklamak istedim.
İşte split(dat, seq_len(nrow(dat)))
bu veri kümesinden kabaca 3 kat daha hızlı olan bulduğum iki yöntem . Aşağıda, 7500 satır, 5 sütunlu veri kümesinde üç yöntemi karşılaştırıyorum ( iris 50 kez tekrarlandı).
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
)
Bu geri dönüyor
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
Farklar önceki setDF
testimdeki kadar büyük olmasa da, düz yöntem, maks (setDF) <min (bölme) ile çalıştırmaların dağıtımının tüm seviyelerinde önemli ölçüde daha hızlıdır ve attr
yöntem tipik olarak iki katından daha hızlıdır.
Dördüncü yöntem, basit bir iç içe geçmiş lapply
olan ve iç içe geçmiş bir liste döndüren ekstrem şampiyondur . Bu yöntem, bir listeden bir data.frame oluşturmanın maliyetini örnekler. Dahası, data.frame
fonksiyonla denediğim tüm yöntemler , data.table
tekniklerden kabaca bir kat daha yavaştı .
veri
dat <- vector("list", 50)
for(i in 1:50) dat[[i]] <- iris
dat <- setDF(rbindlist(dat))
split
türüne sahip her elemandata.frame with 1 rows and N columns
yerinelist of length N