2013-08-28 56 views
1

我想列表如何在不使用data.table的情況下展平列表中的兩個列表?

L1 <- list(A = c(1, 2, 3), B = c(5, 6, 7)) 
L2 <- list(A = c(11, 22, 33), B = c(15, 16, 17)) 
L3 <- list(L1, L2) 
L3 

library(data.table) 

內形成從列表一個data.frame根據 'data.table' 手冊: 「 'rbindlist' 同do.call(」 rbind」,1),但要快得多」

我想實現什麼rbindlist'不使用R基本包

rbindlist不正是我需要的,但‘do.call’不!

rbindlist(L3) 

do.call不會做我想做的

do.call(rbind, L3) 

identical(rbindlist(L3), do.call(rbind, L3)) 

回答

5

我想調用每個as.data.frame時間可能會很昂貴。怎麼樣?

as.data.frame(do.call(mapply, c(L3, FUN=c, SIMPLIFY=FALSE))) 

mapply基本上採用L3的第一要素和應用功能FUN,那麼第二個元素等等......假設你最好兩個列表(L3[[1]]L3[[2]]),那麼你會怎麼做:

mapply(FUN=c, L3[[1]], L3[[2]], SIMPLIFY=FALSE) 

這裏SIMPLIFY=FALSE確保輸出不被轉換(或簡化)爲矩陣。因此它會成爲一個列表。對於一般情況,我們使用do.call並將函數mapply的所有其他參數傳遞給我們的列表。希望這可以幫助。


標杆大數據:

ll <- unlist(replicate(1e3, L3, simplify=FALSE), rec=FALSE) 

aa <- function() as.data.frame(do.call(mapply, c(ll, FUN=c, SIMPLIFY=FALSE))) 
bb <- function() do.call(rbind, lapply(ll, as.data.frame)) 

require(microbenchmark) 
microbenchmark(o1 <- aa(), o2 <- bb(), times=10) 

Unit: milliseconds 
     expr  min   lq  median   uq  max neval 
o1 <- aa() 4.356838 4.931118 5.462995 7.623445 20.5797 10 
o2 <- bb() 673.773795 683.754535 701.557972 710.535860 724.2267 10 

identical(o1, o2) # [1] TRUE 
+1

+1。當然,如果我們追求速度,並且所有列表項的模糊都是相同的,並且我們已經知道它們是什麼:'A < - unlist(ll,use.names = FALSE); dim(A)< - c(3,2,2000);適用(A,2,I)'。很多「如果」雖然:) – A5C1D2H2I1M1N2O1R2T1

+1

謝謝阿倫,你的解決方案是完美的。但是,我不明白args = c(applyMeanList,FUN = c,SIMPLIFY = FALSE))do.call。請你提供進一步的解釋。 –

3

您需要的子錶轉換成L3data.frame第一個:

> do.call(rbind, lapply(L3, as.data.frame)) 
    A B 
1 1 5 
2 2 6 
3 3 7 
4 11 15 
5 22 16 
6 33 17 
相關問題