2016-03-25 7 views
0

Ich habe seit einiger Zeit nach einer Antwort ohne viel Glück gesucht, also Daumen drücken jemand kann mir helfen!Bedingte Max/Min Werte innerhalb von group_by in R

Ich beschäftige mich mit zyklischen Daten und versuche den zugehörigen Wert der beiden Peaks und zwei Täler zu finden - dies ist nicht gleichzusetzen mit den max/min und zweiten max/min Werten, sondern dem max/min und dann die zweiten Max/Min-Werte abhängig von dem Wert, der größer/kleiner als der vorhergehende und nachfolgende Wert ist.

Dies ist ein Beispiel für einen Zyklus

x <- c(3.049, 3.492, 3.503, 3.429, 3.013, 2.881, 2.29, 1.785, 1.211, 0.890, 0.859, 0.903, 1.165, 1.634, 2.073, 2.477, 3.162, 3.207, 3.177, 2.742, 2.24, 1.827, 1.358, 1.111, 1.063, 1.098, 1.287, 1.596, 2.169, 2.292) 

Ich habe 1000 von Zyklen, damit ich die Zyklen group_by in dplyr zu einer Gruppe bin mit und dann zu hoffen, das bedingten max/min Argumente innerhalb von Gruppen anzuwenden.

ich damit irgendwelche Ratschläge zu schätzen wissen würde,

Vielen Dank im Voraus

bearbeiten

ich da die unten Funktion mit nur einem leichten Bearbeiten in der letzten Zeile

return(data.frame(Data.value=x, Time=y, Date=z,HHT=peak, LLT=trough)) 
verwendet habe

wo x ist mein Original x oben, y ist eine Zeit var und z ist ein Datum var. Dies erlaubte mir einige zusätzliche Berechnungen zu den Ergebnissen (ich benötigte die Zeit, zu der der Wert min/max war, sowie den Wert selbst).

So jetzt habe ich einen Datenframe mit allem, was ich brauche, aber es ist nur für ein Datum - ich kann immer noch nicht durch die gesamte Funktion mit dem group_by-Funktion durchlaufen. Ich habe Unter Einstellung von Datum versucht

subsets<-split(data, data$datevar, drop=TRUE)

Verwendung Aber muß noch eine Möglichkeit, die findminmax Funktion (und meine paar zusätzliche Zeilen Code) für jede Untergruppe irgendwie laufen. Irgendwelche Ideen?

Antwort

0

Betrachten Sie die folgende benutzerdefinierte Funktion, die Sie in einem dplyr group_by() Verfahren übergeben können. Im Wesentlichen durchläuft die Funktion zyklisch die Liste der zyklischen Werte und vergleicht den Nachbarn davor und danach. Peaks hätten Nachbarn, die niedriger als sie selbst sind, und Täler mit Nachbarn, die größer sind als sie selbst.

findminmax <- function(x){ 
    peak <- list(NA, NA)        # INITIALIZE TEMP LISTS AND ITERATORS 
    p <- 1 
    trough <- list(NA, NA) 
    t <- 1 

    for (i in 1:length(x)){ 
    if (i != 1 & i != length(x)){     # LEAVES OUT FIRST AND LAST VALUES 
     if ((x[i] > x[i-1]) & (x[i] > x[i+1])) {  # COMPARES IF GREATER THAN NEIGHBORS 
     peak[p] <- x[i] 
     p <- p + 1 
     } 
     if ((x[i] < x[i-1]) & (x[i] < x[i+1])){  # COMPARES IF LESS THAN NEIGHBORS 
     trough[t] <- x[i] 
     t <- t + 1 
     } 
    } 
    } 
    return(list(peak1=peak[[1]], peak2=peak[[2]], 
       trough1=trough[[1]], trough2=trough[[2]])) 
} 

result <- findminmax(x) 
#$peak1 
#[1] 3.503  
#$peak2 
#[1] 3.207  
#$trough1 
#[1] 0.859  
#$trough2 
#[1] 1.063 

Für dplyr des group_by:

finaldf <- originaldf %>% 
      group_by(z) %>% 
       summarise(Time = mean(y), 
          HHT1 = findminmax(x)$peak1, 
          HHT2 = findminmax(x)$peak2, 
          LLT1 = findminmax(x)$trough1, 
          LLT2 = findminmax(x)$trough2) 
+0

Dank @Parfait dieser Funktion funktionierte perfekt, aber ich bin immer noch Probleme nach Datum Gruppierung - meine Änderungen nicht auf die oben gestellte Frage – suuz

+0

Siehe Update sehen. Die Herausforderung besteht darin, dass Sie einen Datenrahmen nicht aus Funktionen, sondern aus skalaren Werten zurückgeben können. Siehe modifizierte 'list()' return. – Parfait

+0

Ich muss dies an den Studiendaten arbeiten, aber sobald ich mich auf das ganze Dataset bewerbe, bekomme ich 'Fehler: Subscript out of bounds' Irgendwelche Ideen? Ich habe Zeilen mit NAs aus dem Datenframe entfernt, aber es könnte sein, dass es 3 Peaks/Täler oder nur 1 Peak/Trough an einem bestimmten Datum gibt, was vielleicht ein Problem verursacht? – suuz