Tôi đã làm việc này hôm nay cho data.frame (thực sự là data.table) với hàng triệu quan sát và 35 cột. Mục tiêu của tôi là trả về một danh sách data.frame (data.tables), mỗi cái có một hàng. Đó là, tôi muốn chia mỗi hàng thành một data.frame riêng biệt và lưu trữ chúng trong một danh sách.
Đây là hai phương pháp tôi nghĩ ra nhanh hơn khoảng 3 lần so split(dat, seq_len(nrow(dat)))
với tập dữ liệu đó. Dưới đây, tôi chuẩn ba phương pháp trên tập dữ liệu 7500 hàng, 5 cột ( iris lặp lại 50 lần).
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
)
Điều này trả lại
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
Mặc dù sự khác biệt không lớn như trong thử nghiệm trước của tôi, nhưng setDF
phương pháp thẳng nhanh hơn đáng kể ở tất cả các cấp độ phân phối các lần chạy với max (setDF) <min (split) và attr
phương pháp này thường nhanh hơn gấp đôi.
Phương thức thứ tư là phương pháp cực trị, là một lapply
danh sách lồng nhau đơn giản , trả về một danh sách lồng nhau. Phương pháp này minh họa chi phí xây dựng data.frame từ một danh sách. Hơn nữa, tất cả các phương pháp tôi đã thử với data.frame
hàm này gần như chậm hơn so với các data.table
kỹ thuật.
dữ liệu
dat <- vector("list", 50)
for(i in 1:50) dat[[i]] <- iris
dat <- setDF(rbindlist(dat))
split
mỗi phần tử có kiểudata.frame with 1 rows and N columns
thay vìlist of length N