2017-05-08 2 views
1

ich eine data haben, die wie folgt aussieht:Funktion den Beginn und das Ende der bedingten Auswahl finden

Date | Time | Temperature 
16995 | "12:00" | 23 
16995 | "12:30" | 24 
... 
17499 | "23:30" | 23 
17500 | "00:00" | 24 

ich eine Funktion schreiben eine Reihe von Fällen Punkten basierend auf bestimmten Start- und Endzeit auszuwählen. Um dies zu tun, muss ich die start_pt und end_pt Indizes ermitteln, die mit einem Paar Zeilen im Datenrahmen übereinstimmen sollten.

select_case <- function(df,date,time) { 
     start_pt = 0 
     end_pt = 0 
     for (i in 1:nrow(df)) { 
     if ((date[i] == 17000) & (time[i] == "12:00")) { 
      start_pt <- i 
      return(start_pt) 
     } else { 
      next 
     } 
     } 
     for (i in start_pt:nrow(df)) { 
     if (date[i] == 17500) { 
      end_pt <- i - 1 
      return(end_pt) 
      break 
     } else { 
      next 
     } 
     } 
     return(df[start_pt:end_pt,]) 
    } 

Als ich anrief:

test <- select_case(data,data$Date,data$Time) 
test 

Ich erwarte, dass die folgenden:

Date | Time | Temperature 
17000 | "12:00" | 23 
17000 | "12:30" | 24 
... 
17499 | "23:00" | 23 
17499 | "23:30" | 23 

i

[1] 1 

Nicht bekam stattdessen sicher, wo ich es hier falsch. Wenn ich jede der zwei for-Schleifen von der R-Konsole getrennt ausführte und die entsprechenden Argumente für jede Schleife ersetzte, erhielt ich die korrekten Indizes für beide start_pt und end_pt.

+0

Ich verstehe nicht ganz die Logik von Start_pt und End_pt. Versuchen Sie, eine feste Anzahl von Zeilen auszuwählen, oder möchten Sie Daten auf der Basis von abweichendem Startdatum und unterschiedlicher Uhrzeit auf Teilmengen aufteilen? –

+0

Weil ich denke, es wäre bequemer, wenn ich diese Subsetting-Funktion über ähnliche Datasets anwenden müsste, in denen das Datum und die Uhrzeit irgendwie anders sein könnten (unvollständige Daten zum Beispiel). Sonst kann ich einfach eine Teilmenge machen: 'start <- was ((data $ Date == 17000) && (test $ Zeit ==" 12:00 ")) end <- tail (was ($ Date == 17499), n = 1) test <- test [start: end,] ' – user94216

+0

Also versuchen Sie eine feste Anzahl von Zeilen auszuwählen? Warum nicht 'start_pt' und' end_pt' als Argument Ihrer Funktion verwenden? –

Antwort

0

Ich habe versucht, jede Schleife in eine separate Funktion, sta(date,time) und end(date) benannt. Dann binde ich sie in der folgenden Funktion:

binder <- function(date,time) { 
    return(sta(date,time),end(date)) 
} 

und rufen

sta_end <- binder(date,time) 

ich den Fehler bekam:

Error in return(sta(date, time), end(date)) : 
    multi-argument returns are not permitted 

, damit ich sie kombiniert und es funktionierte:

binder <- function(date,time) { 
     return(c(sta(date,time),end(date))) 
    } 
sta_end <- binder(date,time) 
[1] 1 <an index for end_pt> 

Also der Fehler, den ich in meinem ursprünglichen fu gemacht habe nction ist, dass ich return() 3 mal verwende und die Funktion wird nur die erste zurückgeben, die start_pt ist. Also nahm ich die ersten beiden return() und behielt die zuletzt:

return(df[start_pt:end_pt,]) 

Das funktionierte, ich das erwartete Ergebnis bekam.

Verwandte Themen