Eu tenho uma lista de listas chamada mylist. No exemplo a seguir, mylist tem duas listas, cada uma contendo outras duas listas de números aleatórios.
mylist <- list()
list1 <- rnorm(100)
list2 <- rnorm(100)
list3 <- rnorm(100)
list4 <- rnorm(100)
mylist[[1]] <- list("list1" = list1, "list2" = list2)
mylist[[2]] <- list("list1" = list3, "list2" = list4)
Ao imprimir o mylist, ele deve nos dar algo como
[[1]]
[[1]]$list1
[1] 0.0382233645 0.2416676908 1.1910173996 0.7833025597 -0.7144370041
[6] 1.9762077872 0.9438593806 0.1590264664 -0.5323112247 1.2820246358...
[[1]]$list2
[1] -0.084982839 -0.462448106 0.771458598 1.354049503 -1.616381590 -0.368789648
[7] -0.678521566 -0.340799431 -0.441370037 -0.212117105 -0.921661840 0.893550382...
[[2]]
[[2]]$list1
[1] 0.367971534 0.028976364 1.391761655 -0.033661646 1.196138270 -1.645738949
[7] 0.086037770 0.530143788 0.639389906 2.193683933 -1.427285285 0.430282258...
[[2]]$list2
[1] 0.235027959 2.110340896 -0.951831561 -1.510063739 -0.007402732 -0.575736079
[7] -0.363731268 1.232404358 -0.848716435 1.217101680 -0.014577878 0.440142686...
Quero remover a listagem de mylist para que os resultados finais (res) produzam dois elementos. O primeiro elemento combinará todos os elementos disponíveis da lista1 e o segundo agregará todos os elementos disponíveis da lista2. Os resultados finais devem ser semelhantes a
res$list1
[1] 0.0382233645 0.2416676908 1.1910173996 0.7833025597 -0.7144370041
[6] 1.9762077872 0.9438593806 0.1590264664 -0.5323112247 1.2820246358...
[101] 0.367971534 0.028976364 1.391761655 -0.033661646 1.196138270 -1.645738949
[107] 0.086037770 0.530143788 0.639389906 2.193683933 -1.427285285 0.430282258...
res$list2
[1] 0.367971534 0.028976364 1.391761655 -0.033661646 1.196138270 -1.645738949
[7] 0.086037770 0.530143788 0.639389906 2.193683933 -1.427285285 0.430282258...
[101] 0.235027959 2.110340896 -0.951831561 -1.510063739 -0.007402732 -0.575736079
[107] -0.363731268 1.232404358 -0.848716435 1.217101680 -0.014577878 0.440142686...
Qual é a maneira correta de fazer isso em R? Obrigado!
Podemos usar
Map
para combinar as sublistas de cada elemento da lista de nível superior.Dados reproduzíveis:
Se for sempre
list1
elist2
(um comprimento pré-conhecido dentro demylist
), então podemos dispensá-lodo.call
e usarMap
diretamente:O (único?) benefício de usar
do.call
é que semylist
for de comprimento desconhecido ou longo e você não quiser ter que digitar tudo demylist[[1]]
,mylist[[2]]
, ...,mylist[[n]]
(o que funcionaria), então uma expressão simples cuida de tudo para você.Ao usar
unlist
, você pode especificarrecursive = FALSE
e então aplicarunstack
+stack
ou
então você deve ser capaz de atingir o resultado desejado
Algumas opções -
purrr::transpose
eunlist
cada listaUma alternativa pode ser usar
list.map
o pacote rlist