2016-01-06 2 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 изменить структуру, чтобы перейти от списка 2x3 до 3x2 список как:

+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

Смежные вопросы