2016-01-06 52 views
3

我有名單的共同結構的列表我怎樣才能重塑的目錄列表從廣角到長

require(data.table) 
l <- list(a1 = list(b=data.table(rnorm(3)), c=data.table(rnorm(3)), d=data.table(rnorm(3))), 
      a2 = list(b=data.table(rnorm(3)), c=data.table(rnorm(3)), d=data.table(rnorm(3)))) 

有時是lapply容易改變結構,從2×3的名單要到3×2像這樣的列表:

+a1---b   +b---a1 
    ---c   ---a2 
    ---d   +c---a1 
+a2---b to  ---a2 
    ---c   +d---a1 
    ---d   ---a2 

有沒有一種慣用的方法來做到這一點?

是否可以在不復制所有表(可能很大)的情況下完成?

+0

看看[這個](http://stackoverflow.com/questions/28653867/best-way-to-transpose-data-table) – HubertL

+0

我不這麼認爲,這是爲data.tables而不是列表的列表(data.tables) – statquant

回答

3

我認爲purrr::transpose()是你在找什麼。

(ll = purrr::transpose(l)) 
# $b 
# $b$a1 
#   V1 
# 1: -0.9615584 
# 2: -0.8849469 
# 3: 0.4831375 
# 
# $b$a2 
#   V1 
# 1: 0.4634884 
# 2: -0.7079083 
# 3: -0.4366986 
# 
# 
# $c 
# $c$a1 
#   V1 
# 1: 0.4710617 
# 2: -0.4927592 
# 3: -1.3484420 
# 
# $c$a2 
#   V1 
# 1: -0.4547821 
# 2: 0.5752723 
# 3: 0.6272826 
# 
# 
# $d 
# $d$a1 
#    V1 
# 1: 0.80827129 
# 2: -0.03640465 
# 3: -1.89417912 
# 
# $d$a2 
#   V1 
# 1: 0.1844341 
# 2: 0.4557670 
# 3: -0.5714462 

檢查尺寸:

length(ll) 
# [1] 3 
sapply(ll, length) 
# b c d 
# 2 2 2 

looks like its implemented in C所以我的猜測是效率是相當好的優化和不必要的複製最小化。

+0

是的!但是所有的表格都被複制過了嗎? – statquant

+0

我會這麼認爲。我想我已經回答了你的第一個問題(*有沒有習慣性的方法來做到這一點?*)。對於第二個問題(*可以在不復制所有表格(可能非常大)的情況下完成)*),我不確定。 – Gregor