2016-07-09 9 views
1

Ich möchte eine verschachtelte Liste transponieren. Sei folgende verschachtelte Liste x gegeben ist:Eine verschachtelte Liste transponieren

a <- list(c("a","b","c","d")) 
b <- list(c("d","c","b","a")) 
c <- list(c("4","3","2","1")) 
d <- list(c("1","2","3","4")) 

x <- list(a,b,c,d) 

Das Ergebnis eine verschachtelte Liste sein soll, wo die erste Spalte der ursprünglichen Liste x ist das erste nested Listenelement, das heißt „a“, „d“,“ 4 "," 1 ", die zweite Spalte ist das zweite verschachtelte Listenelement, dh" b "," c "," 3 "," 2 "und so weiter. Am Ende ist die Struktur eine Art Transposition der ursprünglichen Struktur. Wie kann das in R gemacht werden?

+0

'Bibliothek (purrr); x%>% simplify_all()%>% transpose()%>% simplify_all()%>% map (Liste) 'wenn die Vektoren transponiert werden sollen, aber die Struktur gleich ist, obwohl sie wirklich unnötig verschachtelt ist. – alistaire

+0

@alistaire danke, aber wenn zum Beispiel ein Vektor aus Ganzzahlen besteht, statt Zeichen, funktioniert das nicht mehr. – user3032689

+1

Vektoren können nur einen Typ enthalten; 'purrr' lässt Sie Zeichen und Ganzzahlen nicht vereinfachen, ohne explizit auf einen Typ zu drücken, z. 'x%>% simplify_all()%>% map (als Zeichen)%>% transpose()%>% simplify_all()%>% map (list)'. Wenn Sie es vorziehen, wird 'data.table :: transpose 'automatisch erzwungen. – alistaire

Antwort

3

Wir versuchen

m1 <- do.call(rbind, lapply(x, function(y) do.call(rbind, y))) 
relist(m1, skeleton = x) 
+0

nett thx. Ist das auch für große Datenstrukturen wie große Matrizen möglich? Mein MWE war nicht so gut, ich hätte stattdessen Matrizen verwenden sollen. – user3032689

+0

@ user3032689 Ich habe nicht für große Datensätze getestet. Sie können auch die 'transpose' von' purrr' – akrun

+0

überprüfen, siehe bitte die bearbeitete Frage. Purrr hilft mir auch nicht. – user3032689

4

Wir auch ohne lapply (mit Matrix) tun könnte:

relist(matrix(unlist(x), ncol = 4, byrow = T), skeleton = x) 

Benchmarking

library(microbenchmark) 
a <- list(c("a","b","c","d")) 
b <- list(c("d","c","b","a")) 
c <- list(c("4","3","2","1")) 
d <- list(c("1","2","3","4")) 
x <- list(a,b,c,d) 

f_akrun <- function(x) {m1 <- do.call(rbind, lapply(x, function(y) do.call(rbind, y)));relist(m1, skeleton = x);} 
f_m0h3n <- function(x) {relist(matrix(unlist(x), ncol = length(x[[1]][[1]]), byrow = T), skeleton = x)} 

setequal(f_akrun(x), f_m0h3n(x)) 
# [1] TRUE 
microbenchmark(f_akrun(x), f_m0h3n(x)) 

# Unit: microseconds 
    # expr  min  lq  mean median  uq  max neval 
# f_akrun(x) 135.591 137.301 144.3545 138.585 148.422 334.484 100 
# f_m0h3n(x) 110.782 111.638 116.5477 112.493 117.412 212.153 100