2017-04-15 9 views
0

Ich möchte eine allgemeine Lösung für ein bestimmtes Problem haben. Ich habe eine verschachtelte Liste; Jedes Element dieser Liste ist eine Liste mit benannten Elementen. Zum Beispiel:verketten Vektoren aus einer Liste von Listen

mylist <- list(
    list(x1 = 1:10, x2 = letters[1:5]), 
    list(x1 = 11:14, x2 = letters[6:15]) 
) 

hier mylist[[1]] und mylist[[2]] jeweils Vektoren x1 und x2.

ich alle x1 Vektoren und x2 Vektoren verketten möchten, wie zu erhalten:

c(mylist[[1]]$x1, mylist[[2]]$x1) 
c(mylist[[1]]$x2, mylist[[2]]$x2) 

aber für einen allgemeinen Fall, in dem mylistn Elemente haben könnte.

Wenn ich von vornherein wusste, dass mylist nur zwei Elemente hat, dann könnte ich

do.call(function(a,b) c(a$x1, b$x1), mylist) 
do.call(function(a,b) c(a$x2, b$x2), mylist) 

benutzen, aber ich weiß nicht, wie dies für n Elemente zu verallgemeinern.

+0

Siehe '.mapply' -' .mapply (c, mylist, NULL) 'oder die bequemere Schnittstelle'? do.call (Karte, c (c, mylist)) ' –

Antwort

1
vecs <- unlist(mylist, recursive = F) 
lapply(unique(names(vecs)), function(name) do.call(c, vecs[name == names(vecs)])) 
0

Wenn Sie wollen, dass diese die tidyverse dann mit tun:

library(tidyverse) 
purrr::transpose(mylist) %>% purrr::map(purrr::flatten) 
Verwandte Themen