2016-03-24 8 views
2

a gemacht wird, ist eine Liste mit Listen:Extract Spalte aus der Liste, die aus Listen

a<-list(list(matrix(c(0,0,0,1,2,1,2,2,2,1,1,1),3), 
      matrix(c(0,0,1,2,2,2,2,1),2)), 
     list(matrix(c(0,0,1,2,2,1,1,1,2,2,2,2),3))) 

> a 
[[1]] 
[[1]][[1]] 
    [,1] [,2] [,3] [,4] 
[1,] 0 1 2 1 
[2,] 0 2 2 1 
[3,] 0 1 2 1 

[[1]][[2]] 
    [,1] [,2] [,3] [,4] 
[1,] 0 1 2 2 
[2,] 0 2 2 1 


[[2]] 
[[2]][[1]] 
    [,1] [,2] [,3] [,4] 
[1,] 0 2 1 2 
[2,] 0 2 1 2 
[3,] 1 1 2 2 

ich die Faust Spalte aller Objekte extrahieren möchten. Wir wissen, ob die Liste aus einer Matrix besteht, wir können die "Map" -Funktion verwenden, um dieses Problem zu lösen, aber jetzt besteht die Liste aus Listen, wir können "Map" nicht nur verwenden, um dieses Problem zu lösen, wie kann ich das tun das leicht?

I-Code verwenden folgende dieses Problem zu lösen:

sapply(1:length(a), function(x) {Map(function(y) y[,1],a[[x]])}) 

Es gelöst werden kann, aber ich frage mich, ob es ein bequemer Weg, um dieses Problem zu lösen, wie ich später mehr Werke tun müssen, basierend auf diese Frage. Vielen Dank!

+0

@rawr Sie lassen mich "rapply" kommen, danke! – lightsnail

+1

@rawr - das sollte wirklich die Antwort hier sein - es ist generisch und erweiterbar – thelatemail

Antwort

5

Ich denke, die folgenden Werke:

sapply(unlist(a, recursive = FALSE), function(x) x[ , 1]) 

# [[1]] 
# [1] 0 0 0 
# 
# [[2]] 
# [1] 0 0 
# 
# [[3]] 
# [1] 0 0 1 

Das wird nicht funktionieren, wenn die Verschachtelung auf a über eine Ebene erstreckt.

Alle gebührende Anerkennung für eine Lösung @rawr, die uns die ursprüngliche list Struktur unter Verwendung von rapply finden ?rapply für mehr behalten können:

rapply(a, function(x) x[,1], how = "list") 
# [[1]] 
# [[1]][[1]] 
# [1] 0 0 0 
# 
# [[1]][[2]] 
# [1] 0 0 
# 
# 
# [[2]] 
# [[2]][[1]] 
# [1] 0 0 1 
+0

unlist (a, recursive = FALSE) ist erstaunlich! Obwohl das Ergebnis nicht in der Listenstruktur ist, ist dieser Code wunderbar! Und ich habe versucht, unlist (a), hat nur eine Reihe von Zahlen. "recursive = FALSE" ist hilfreich! Ich danke dir sehr! – lightsnail

1

Ebenso denke ich, eine andere Lösung könnte eine verschachtelte lapply Funktion sein . Hier kann es allerdings sehr knifflig werden.

Der Code ist:

lapply(a, function(x) lapply(x, 
         function(x) x[,1])) 

Wir sind im Wesentlichen zwei Ebenen auf der Liste hinunter (von lapply zweimal Aufruf) dann die erste Spalte Extrahieren (unter Verwendung von x [1]).

Das Ergebnis ist:

[[1]] 
[[1]][[1]] 
[1] 0 0 0 

[[1]][[2]] 
[1] 0 0 

[[2]] 
[[2]][[1]] 
[1] 0 0 1 

Hinweis Dies erfordert auch, dass wir unsere Liste kennen nur zwei Ebenen erstreckt.

Verwandte Themen