Объединить размеры списков списков в отдельные векторы - PullRequest
0 голосов
/ 24 сентября 2018

Вот пример моих данных.

ll <- list(
  ll1 = list(Mi = 1:4,
       Mj = 10:13,
       dn = "l1"),
  ll2 = list(Mi = 5:8,
             Mj = 14:17,
             dn = "l2"))
> str(ll)
List of 2
 $ ll1:List of 3
  ..$ Mi: int [1:4] 1 2 3 4
  ..$ Mj: int [1:4] 10 11 12 13
  ..$ dn: chr "l1"
 $ ll2:List of 3
  ..$ Mi: int [1:4] 5 6 7 8
  ..$ Mj: int [1:4] 14 15 16 17
  ..$ dn: chr "l2"

Я пытаюсь объединить каждое Mi, каждое Mj и каждое dn вместе.Таким образом, окончательный результат будет 3 векторами: 1 объединенный Mi, 1 объединенный Mj и 1 объединенный dn.Т.е. конечный результат для Mi будет примерно таким:

> c(ll$ll1$Mi,ll$ll2$Mi)
[1] 1 2 3 4 5 6 7 8

Аналогичные конечные результаты для Mj и dn.Мне интересно, как это сделать просто, желательно используя что-то из Tidyverse.Количество списков будет разным и не будет 2 в целом, поэтому я не думаю, что c - это отличное решение.Я предполагаю, что функции карты могут работать здесь, но я еще не нашел решение.

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

С pmap от purrr.pmap берет список входных данных (в данном случае список из двух списков) и применяет функцию c к ll[[1]][[1]], ll[[2]][[1]], ... затем ll[[1]][[2]], ll[[2]][[2]], ... ии так далее:

library(purrr)
pmap(ll, c)

Вывод:

$Mi
ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
   1    2    3    4    5    6    7    8 

$Mj
ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
  10   11   12   13   14   15   16   17 

$dn
 ll1  ll2 
"l1" "l2"

Если мы не хотим сохранять имена векторов, мы можем использовать аргумент use.names вc:

pmap(ll, c, use.names = FALSE)

Выход:

$Mi
[1] 1 2 3 4 5 6 7 8

$Mj
[1] 10 11 12 13 14 15 16 17

$dn
[1] "l1" "l2"
0 голосов
/ 24 сентября 2018

Другой вариант - использовать purrr::transpose и unlist.Это даст вам список из трех векторов:

purrr::transpose(ll) %>% lapply(unlist)

$Mi
ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
   1    2    3    4    5    6    7    8 

$Mj
ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
  10   11   12   13   14   15   16   17 

$dn
 ll1  ll2 
"l1" "l2" 
0 голосов
/ 24 сентября 2018

Вот один из вариантов.

library(tidyverse)

groups <- names(ll$ll1)

ll2 <- map(groups, ~unlist(map(ll, .x)))

names(ll2) <- groups

ll2
# $`Mi`
# ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
# 1    2    3    4    5    6    7    8 
# 
# $Mj
# ll11 ll12 ll13 ll14 ll21 ll22 ll23 ll24 
# 10   11   12   13   14   15   16   17 
# 
# $dn
# ll1  ll2 
# "l1" "l2" 
...