2016-07-31 9 views
2

Ich habe von STATA zu R übergegangen, und ich experimentierte mit verschiedenen Datentypen, so dass die Datenstrukturen von R in meinem Kopf klar sind.Indizierung verschachtelte Listenstruktur in R

Hier ist, wie ich meine Datenstruktur auf:

b<-list(u=5,v=12) 
c<-list(u=7) 
j<-list(name="Joe",salary=55000,union=T) 
bcj<-list(b,c,j) 

Nun, ich hatte versucht, verschiedene Möglichkeiten, um herauszufinden, für den Zugriff auf u = 5. Ich glaube, es gibt drei Möglichkeiten:

Try1:

bcj[[1]][[1]] 

Ich habe 5. Richtig!

Try2:

bcj[[1]][["u"]] 

Ich habe 5. Richtig!

Try3:

bcj[[1]]$u 

Ich habe 5. Richtig!

Try4

bcj[[1]][1][1] 

Hier ist, was ich habe:

bcj[[1]][1][1] 
$u 
[1] 5 

class(bcj[[1]][1][1]) 
[1] "list" 

Frage 1: Warum ist das passiert?

Auch experimentierte ich mit dem folgenden:

bcj[[1]][1][1][1][1][1] 
$u 
[1] 5 

class(bcj[[1]][1][1][1][1][1]) 
[1] "list" 

Frage 2: Ich würde einen Fehler zu erwarten, weil ich nicht glaube, so viele Listen in bcj existieren, aber R gab mir eine Liste. Warum ist das passiert?

PS: Ich sah this thread auf SO, aber es geht um ein anderes Problem.

Antwort

2

Ich denke, das ist ausreichend, um Ihre Frage zu beantworten. Betrachten wir eine Länge-1 Liste:

x <- list(u = 5) 
#$u 
#[1] 5 
length(x) 
#[1] 1 

x[1] 
x[1][1] 
x[1][1][1] 
... 

gibt Ihnen immer die gleiche:

#$u 
#[1] 5 

Mit anderen Worten, x[1]-x identisch sein wird, und Sie fallen in eine unendliche Rekursion. Egal wie viele [1] Sie schreiben, Sie erhalten nur x selbst.

Wenn ich t1<-list(u=5,v=7) erstellen und dann tun t1[2][1][1][1] ... funktioniert das auch.Allerdings gibt t1[[2]][2]NA


, dass der Unterschied zwischen [[ und [, wenn eine Liste der Indizierung. Die Verwendung von [ führt immer zu einer Liste, während [[ den Inhalt herausnimmt. Vergleichen:

z1 <- t1[2] 
## this is a length-1 list 
#$v 
#[1] 7 
class(z1) 
# "list" 

z2 <- t1[[2]] 
## this takes out the content; in this case, a vector 
#[1] 7 
class(z2) 
#[1] "numeric" 

Wenn Sie z1[1][1]... tun, wie oben beschrieben, können Sie immer mit z1 am Ende selbst. Während, wenn Sie z2[2] tun, erhalten Sie sicherlich eine NA, weil z2 nur ein Element hat, und Sie fragen nach dem 2. Element.


Vielleicht ist diese Post und meine Antwort ist für Sie nützlich: Extract nested list elements using bracketed numbers and names?

+1

Dank Zheyuan. Das hilft. Interessanterweise, wenn ich t1 <-list (u = 5, v = 7) und dann t1 [2] [1] [1] [1] erzeuge, funktioniert das auch. T1 [[2]] [2] ergibt jedoch NA .. – watchtower

+2

Dies ist ein normales Verhalten. Die Grundeinheit in R ist ein Vektor. 't1 [2]' gibt einen Vektor (der Länge eins) zurück. 't1 [2] [1]' gibt den ersten Eintrag in diesem Vektor zurück, der eine Zahl ist, aber in gewissem Sinne ist es auch ein Vektor der Länge eins, und dieser kann weitergehen. Wie für 't1 [[2]] [2]', fragen Sie nach einem Element, das nicht existiert, also NA anstelle einer Fehlermeldung. –

+1

Zheyuan und p_barill, Danke für wunderbare Kommentare. Ich weiß, dass Sie meine Frage bereits beantwortet haben, aber ich, wie ich darüber nachdenke, habe ich eine kurze Frage. Im t1-Beispiel (d. H. T1 <-list (u = 5, v = 7)) ist die Länge (t1) 2, was sinnvoll ist. Auch die Länge (t1 [1]) ist 1, was auch Sinn macht, da es nur eine Liste gibt. Gibt es jedoch eine Möglichkeit, dass die Länge (t1 [1]) größer als 1 sein könnte? Ich bin mir nicht ganz sicher, also dachte ich daran, euch zu fragen. Ich würde deine Gedanken schätzen. Entschuldigung für das Hin und Her. – watchtower