2017-01-27 6 views
1

Ich habe einige Probleme bei der Manipulation einer Matrix, die ich aus einer Liste von Listen erstellt habe. Ich verstehe nicht wirklich, warum die resultierende Matrix sich nicht wie eine normale Matrix verhält. Das heißt, ich erwarte, wenn ich eine Spalte unterteilen, damit es einen Vektor zurückgibt, aber stattdessen erhalte ich eine Liste. Hier ist ein funktionierendes Beispiel:Subsetting einer Matrix aus einer Liste von Listen erstellt

x = list() 
x[[1]] = list(1, 2, 3) 
x[[2]] = list(4, 5, 6) 
x[[3]] = list(7, 8, 9) 

y = do.call(rbind, x) 
y 
    [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 4 5 6 
[3,] 7 8 9 

y ist in dem Format, das ich erwarte. Letztendlich werde ich eine Liste dieser Matrizen haben, die ich mitteln möchte, aber ich bekomme immer einen Fehler, der darauf zurückzuführen ist, dass wenn Sie diese Matrix unterteilen, Sie Listen anstelle von Vektoren erhalten.

y[,1] 
[[1]] 
[1] 1 

[[2]] 
[1] 4 

[[3]] 
[1] 7 

Weiß jemand a) warum das passiert? und b) Wie könnte ich dieses Problem vermeiden/lösen?

Vielen Dank im Voraus

Antwort

1

Dies ist nur ein weiteres Problem mit "Matrix der Liste" ist. Sie müssen

do.call(rbind, lapply(x, unlist)) 

oder noch einfacher:

matrix(unlist(x), nrow = length(x), byrow = TRUE) 

Wenn Sie einige Hintergrundinformationen lesen müssen, finden Sie unter: Why a row of my matrix is a list. Das ist ein komplexerer Fall als Ihres.

1

Es sieht so aus, als ob das Problem dadurch entsteht, dass x eine Liste von Listen ist, und nicht eine Liste von Vektoren. Dies ist nicht groß, aber es wird funktionieren:

y = do.call(rbind, lapply(x, unlist)) 
+0

Eine Idee, warum eine Matrix aus einer Liste von Listen anders als eine Liste von Vektoren arbeiten würde? Meine Annahme war, dass es, sobald es eine Matrix ist, wie eine Matrix funktioniert. Vielleicht gibt es Subtypen der Matrix? – SamPassmore

0

do.call für jede Liste das Argument übergibt getrennt, so dass Sie wirklich nur verbindlich Ihre drei Listen zusammen. Dies erklärt, warum sie im Listenformat sind, wenn Sie die Elemente aufrufen.

Unlist X und dann Sapply verwenden, um Ihre Matrix zu erstellen. Da R standardmäßig die Spalten zuerst ausfüllt, müssen Sie diese transponieren, um die gewünschte Matrix zu erhalten.

y <- t(sapply(x, unlist)) 
Verwandte Themen