3 回答

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

TA貢獻(xiàn)1895條經(jīng)驗 獲得超7個贊
今天,我正在為一個具有數(shù)百萬個觀測值和35列的data.frame(實(shí)際上是一個data.table)進(jìn)行此工作。我的目標(biāo)是返回一個data.frames(data.tables)列表,每個列表只有一行。也就是說,我想將每一行拆分為一個單獨(dú)的data.frame并將它們存儲在列表中。
這是我想出的兩種方法,它們的速度大約比split(dat, seq_len(nrow(dat)))該數(shù)據(jù)集快3倍。下面,我在7500行,5列數(shù)據(jù)集上對這三種方法進(jìn)行了基準(zhǔn)測試(虹膜重復(fù)了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)的運(yùn)行分布的所有級別上,直接方法都明顯更快,并且該attr方法通??靸杀兑陨稀?/p>
第四種方法是極端冠軍,它是一個簡單的嵌套lapply,返回嵌套列表。此方法舉例說明了從列表構(gòu)造data.frame的成本。而且,我使用該data.frame函數(shù)嘗試的所有方法都比data.table技術(shù)慢了一個數(shù)量級。
數(shù)據(jù)
dat <- vector("list", 50)
for(i in 1:50) dat[[i]] <- iris
dat <- setDF(rbindlist(dat))
- 3 回答
- 0 關(guān)注
- 655 瀏覽
添加回答
舉報