Wenn ich die Frage richtig verstehe, möchten Sie erkennen, wenn sich die Frage h_no
nicht erhöht, und dann die Frage erhöhen class
. (Ich werde durchgehen, wie ich dieses Problem gelöst habe. Am Ende gibt es eine in sich geschlossene Funktion.)
Arbeiten
Die h_no
Spalte ist uns momentan nur wichtig, daher können wir sie aus dem Datenrahmen extrahieren:
> h_no <- data$h_no
Wir wollen erkennen, wann h_no
nicht steigt, was wir tun können, indem wir herausfinden, wann der Unterschied zwischen aufeinanderfolgenden Elementen entweder negativ oder null ist. R liefert die diff
Funktion, die uns den Vektor der Unterschiede gibt:
> d.h_no <- diff(h_no)
> d.h_no
[1] 1 1 1 -3 1 1 1 1 1 1 -6 1 1 1
Sobald wir das haben, ist es einfach, diejenigen zu finden, die nicht positiv sind:
> nonpos <- d.h_no <= 0
> nonpos
[1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
[13] FALSE FALSE
In R TRUE
und FALSE
sind im Grunde die gleichen wie 1
und 0
. Wenn wir also die kumulative Summe von erhalten nonpos
, erhöht sie sich um 1 in (fast) den entsprechenden Stellen. Die cumsum
Funktion (die im Grunde das Gegenteil von ist diff
) kann dies tun.
> cumsum(nonpos)
[1] 0 0 0 1 1 1 1 1 1 1 2 2 2 2
Es gibt jedoch zwei Probleme: Die Zahlen sind eins zu klein; und wir vermissen das erste Element (es sollten vier in der ersten Klasse sein).
Das erste Problem ist einfach gelöst: 1+cumsum(nonpos)
. Und das zweite erfordert nur das Hinzufügen eines a 1
an der Vorderseite des Vektors, da das erste Element immer in der Klasse ist 1
:
> classes <- c(1, 1 + cumsum(nonpos))
> classes
[1] 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3
Jetzt können wir es mit wieder an unseren Datenrahmen anhängen cbind
(mithilfe der class=
Syntax können wir der Spalte die class
Überschrift geben):
> data_w_classes <- cbind(data, class=classes)
Und data_w_classes
enthält jetzt das Ergebnis.
Endergebnis
Wir können die Zeilen zusammen komprimieren und alles in eine Funktion zusammenfassen, um die Verwendung zu vereinfachen:
classify <- function(data) {
cbind(data, class=c(1, 1 + cumsum(diff(data$h_no) <= 0)))
}
Oder, da es Sinn macht für die class
, ein Faktor zu sein:
classify <- function(data) {
cbind(data, class=factor(c(1, 1 + cumsum(diff(data$h_no) <= 0))))
}
Sie verwenden eine der folgenden Funktionen:
> classified <- classify(data) # doesn't overwrite data
> data <- classify(data) # data now has the "class" column
(Diese Methode zur Lösung dieses Problems ist gut, da sie eine explizite Iteration vermeidet, die im Allgemeinen für R empfohlen wird, und das Erzeugen vieler Zwischenvektoren und Listen usw. vermeidet. Außerdem ist es ziemlich ordentlich, wie es in eine Zeile geschrieben werden kann :))