3 回答

TA貢獻1853條經驗 獲得超6個贊
像這樣:
xy.list <- split(xy.df, seq(nrow(xy.df)))
而且,如果希望xy.df將行名作為輸出列表的名稱,則可以執行以下操作:
xy.list <- setNames(split(xy.df, seq(nrow(xy.df))), rownames(xy.df))

TA貢獻1895條經驗 獲得超7個贊
今天,我正在為一個具有數百萬個觀測值和35列的data.frame(實際上是一個data.table)進行此工作。我的目標是返回一個data.frames(data.tables)列表,每個列表只有一行。也就是說,我想將每一行拆分為一個單獨的data.frame并將它們存儲在列表中。
這是我想出的兩種方法,它們的速度大約比split(dat, seq_len(nrow(dat)))該數據集快3倍。下面,我在7500行,5列數據集上對這三種方法進行了基準測試(虹膜重復了50次)。
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
)
這返回
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
盡管差異沒有我以前的測試中的大,但是setDF在max(setDF)<min(split)的運行分布的所有級別上,直接方法都明顯更快,并且該attr方法通常快兩倍以上。
第四種方法是極端冠軍,它是一個簡單的嵌套lapply,返回嵌套列表。此方法舉例說明了從列表構造data.frame的成本。而且,我使用該data.frame函數嘗試的所有方法都比data.table技術慢了一個數量級。
數據
dat <- vector("list", 50)
for(i in 1:50) dat[[i]] <- iris
dat <- setDF(rbindlist(dat))
- 3 回答
- 0 關注
- 651 瀏覽
添加回答
舉報