亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

data.frame行到列表

data.frame行到列表

MM們 2019-10-25 15:28:09
我有一個data.frame,我想按行將其轉換為列表,這意味著每行將對應于其自己的列表元素。換句話說,我想要一個只要data.frame有行的列表。到目前為止,我已經按照以下方式解決了這個問題,但是我想知道是否有更好的方法來解決這個問題。xy.df <- data.frame(x = runif(10),  y = runif(10))# pre-allocate a list and fill it with a loopxy.list <- vector("list", nrow(xy.df))for (i in 1:nrow(xy.df)) {    xy.list[[i]] <- xy.df[i,]}
查看完整描述

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))


查看完整回答
反對 回復 2019-10-25
?
人到中年有點甜

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))


查看完整回答
反對 回復 2019-10-25
  • 3 回答
  • 0 關注
  • 651 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號