2017-07-25 2 views
0

Ich versuche gerade Daten aus mehreren Datenrahmen (A1-A8) auszulesen, die alle die gleiche Struktur haben, mit einer for-Schleife. Innerhalb der for-Schleife möchte ich Daten extrahieren, die eine bestimmte Bedingung (in diesem Fall eine bestimmte Tiefe) erfüllen. Ich habe das mit Teilmenge und wenn-sonst versucht. Das Problem, das mir bevorsteht, ist, dass, falls diese Bedingung nicht erfüllt ist, die for-Schleife unterbrochen wird und die folgenden Schritte nicht ausgeführt werden. Hier ist das Beispiel:Bedingte Datenextraktion aus mehreren Datenrahmen

Depth <- c(40,60,70,80,85,90) 
D2H <- c(-60,-65,-63,-67,-58,-66) 
A1 <- data.frame(Depth, D2H) 

for (i in 1:8) { 
    Ax <- get((paste("A",i,sep="")))# reads in the dataframe 
    A_40[i] <- subset(Ax$D2H, Ax$Depth == 40) #writes the value of D2H at depth 40 into the new vector 
    A_60[i] <- subset(Ax$D2H, Ax$Depth == 60) 
} 

Wenn also zum Beispiel Datenrahmen A3 nicht Depth = 40 enthält, die für die Schleife unterbrochen wird. Wie kann ich dieses Problem überwinden? Falsche Vorgehensweise?

Ich hoffe, ich habe das Problem gut genug beschrieben, wenn nicht, lass es mich wissen und ich werde die Beschreibung erweitern. Ich bin sehr dankbar für Empfehlungen.

+1

also erhalten Sie einen Fehler mit diesem Ansatz? Sie können versuchen, die 'which()' zu verwenden, um die Zeilen zu finden, die die Bedingungen erfüllen, und dann die Anzahl der zufriedenstellenden Zeilen mit 'length()' zu überprüfen. Nur wenn die Länge größer als 'Null' ist, versuchen Sie die 'subset()'. – TUSHAr

Antwort

1

Wenn Sie mit einer Liste von Datenrahmen betrachten wollen, so etwas wie dies könnte erreichen, was Sie nach

Depth <- c(40,60,70,80,85,90) 
D2H <- c(-60,-65,-63,-67,-58,-66) 
A1 <- data.frame(Depth, D2H) 

set.seed(123) ## these would be your other 7 data frames in your case 
A2 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 
A3 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 
A4 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 
A5 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 
A6 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 
A7 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 
A8 <- A1[sample(nrow(A1), nrow(A1), replace = TRUE),] 

mydflist <- list(A1, A2, A3, A4, A5, A6, A7, A8) 

newlist40 <- lapply(mydflist, function(x) subset(x$D2H, x$Depth == 40)) 
newlist60 <- lapply(mydflist, function(x) subset(x$D2H, x$Depth == 60)) 

EDIT

newlist40.b <- lapply(newlist40, function(x) if(length(x)==0) x <- NA else x) 
newlist40.final <- unlist(lapply(newlist40.b, unique)) ## if you want unique values from each array in list 
# newlist40.final <- unlist(newlist40.b) # if you don't 

newlist60.b <- lapply(newlist60, function(x) if(length(x)==0) x <- NA else x) 
newlist60.final <- unlist(lapply(newlist60.b, unique)) ## if you want unique values from each array in list 
# newlist60.final <- unlist(newlist60.b) # if you don't 
+0

Großartig! Vielen Dank! Das einzige Problem ist, dass ich als Ergebnis eine Liste anstelle eines Vektors bekomme. Gibt es eine Möglichkeit, einen Vektor direkt zu bekommen? – Niknak

+0

Sie möchten einen Vektor mit eindeutigen Werten, unabhängig vom Datenrahmen, aus dem sie stammen? Wie sollte der Vektor aussehen? – simone

+0

im Grunde ein Vektor mit den 8 Werten, die ich aus den Datenrahmen las, am besten mit NA, wenn es keine gab. – Niknak

0

ich Simones Weise denken, ist die beste Antwort, aber wenn Sie entschlossen sind, eine for-Schleife zu verwenden, hat der Fix hier damit zu tun, nur eine if-Bedingung zu schreiben.

for (i in 1:8) { 
    Ax <- get((paste("A",i,sep="")))# reads in the dataframe 

    if (length(subset(Ax$D2H, Ax$Depth == 40) > 0) {A_40[i] <- subset(Ax$D2H, Ax$Depth == 40) 
    } else { A_40[i] = NA } 

    if (length(subset(Ax$D2H, Ax$Depth == 60) > 0) {A_60[i] <- subset(Ax$D2H, Ax$Depth == 60) 
    } else { A_60[i] = NA } 
} 
+0

Ja, das funktioniert auch großartig. Ich habe versucht, die if-Funktion zu verwenden, konnte aber nicht herausfinden, wie. Das sieht viel besser aus! Vielen Dank! – Niknak