2012-03-29 8 views
1

Ich habe die folgenden Daten und für Schleife verschachtelt:Eine weitere verschachtelte Schleife in R

x <- c(12, 27, 21, 16, 12, 21, 18, 16, 20, 23, 21, 10, 15, 26, 21, 22, 22, 19, 26, 26) 
y <- c(8, 10, 7, 7, 9, 5, 7, 7, 10, 4, 10, 3, 9, 6, 4, 2, 4, 2, 3, 6) 

a <- c(20,25) 
a.sub <- c() 
df <- c() 
for(j in 1:length(a)){ 
    a.sub <- which(x >= a[j]) 
    for(i in 1:length(a.sub)){ 
     df[i] <- y[a.sub[i]]  
    } 
    print(df) 
} 

ich die Schleife Werte zurückgeben möchte für df als:

[1] 10 6 3 6 4 10 6 4 2 4 3 6 
[1] 10 6 3 6 

Wie ich es habe, Allerdings gibt die Schleife zweimal die gleichen Werte von df für eine < - 20, aber kein < - 25:

[1] 10 7 5 10 4 10 6 4 2 4 3 6 
[1] 10 6 3 6 4 10 6 4 2 4 3 6 
+0

'Fehler in der (p> = a [j]): Objekt 'p' nicht – Chase

+2

found' und vielleicht erklären, was es ist, dass Sie in Englisch zu tun versuchen, verschachtelte Schleifen in R können häufig neu geschrieben werden, unter Verwendung von anderen, effizienteren Konstrukten – Chase

+0

Dank des oben genannten Fehler behoben. – srmulcahy

Antwort

1
for(i in 1:length(a.sub)){ 
    df[i] <- y[a.sub[i]]  
} 

df <- y[a.sub]  

weder a.sub noch df Notwendigkeit vorgegeben werden dann und so ...

x <- c(12, 27, 21, 16, 12, 21, 18, 16, 20, 23, 21, 10, 15, 26, 21, 22, 22, 19, 26, 26) 
y <- c(8, 10, 7, 7, 9, 5, 7, 7, 10, 4, 10, 3, 9, 6, 4, 2, 4, 2, 3, 6) 

a <- c(20,25) 
for(j in 1:length(a)){ 
    a.sub <- which(x >= a[j]) 
    df <- y[a.sub]  
    print(df) 
} 

werden kann es gemacht werden könnte kürzer. df ist unnötig, wenn Sie nur die Untermenge von y trotzdem drucken. Drucken Sie es einfach direkt aus. Und der Selektor ist so kurz, dass eine einzelne Zeile nicht verwirrend wäre. Darüber hinaus, warum Länge von a und index verwenden. Schleife direkt durch. So könnte es sein, ...

a <- c(20,25) 
for(ax in a){ 
    print(y[ which(x >= ax) ]) 
} 
+0

Aber ich glaube nicht, dass die Rendite: [1] 10 6 3 6 4 10 6 4 2 4 3 6 –

+0

Ich bin damit einverstanden .. aber es vereinfacht seinen Code und repliziert, was das tat wirklich ... vielleicht kann er es tun machen, was Zum Teufel hat er jetzt gesucht, dass es einfacher ist. :) – John

0

Nicht sicher, ob dies eine vereinfachte Version eines komplexeren Problem ist, aber ich würde wahrscheinlich lösen diese eine direkte Indizierung und eine Funktion anwenden. Etwas wie folgt aus:

z <- cbind(x,y) 
sapply(c(20,25), function(x) z[z[, 1] >= x, 2]) 
[[1]] 
[1] 10 7 5 10 4 10 6 4 2 4 3 6 

[[2]] 
[1] 10 6 3 6 
+0

Irgendwie möchte das ursprüngliche Poster: 10 6 3 6 4 10 6 4 2 4 3 6 das erste Mal durch die zweite Schleife. –

+0

warum mit cbind stören? Sie können einfach als separate Vektoren behandelt werden. – John

+0

@John - guter Punkt, Gewohnheit Kreatur nehme ich an? Ich habe diese (irrationale) Angst vor der Reihenfolge der Objekte aus dem Gleichgewicht gerät immer, wenn sie völlig getrennte Einheiten sind, oder in meinem Arbeitsbereich durch einen anderen Befehl beschädigt zu werden ... würde ich wahrscheinlich auch laufen 'rm (x, y)' nach dem Erstellen 'Z', um mich nicht zu verwechseln ... aber es ist wahrscheinlich übertrieben und nicht notwendig, da Sie darauf hinweisen. – Chase