2016-07-29 8 views
2

Wie finden Sie den letzten niedrigsten Wert in diesem Vektor mit einer bestimmten Toleranz, ohne die Reihenfolge zu ändern?Kleinsten Wert mit Toleranz finden

Beispiel:

c(0, 785, 10273, 6231, 5417, 2328, 5249, 1725, 2656, 6258, 2687, 
2651, 1063, 325, 2556, 738, 631, 140, 57, 1173, 407, 225, 135, 
69, 81, 21, 16, 3, 0, 26, 1, 2, 0, 1, 2, 1, 1, 0, 0, 3, 1, 0, 
0, 0, 1, 0, 0, 0, 0, 1, 0) 

Es sei angenommen, eine Toleranz von 26 rückwärts Arbeiten vom letzten Elemente (0) Ich mag die Position der Zahl mit einer Toleranz zurückzubringen größer als 26 von der vorhergehenden Nummer. In diesem Beispiel wäre es Position 30 oder die Nummer 26 sein

Antwort

2

Wenn ich Ihre Frage richtig verstehe, können Sie dies tun:

tail(which(diff(x)>=26),1L)+1L; 
## [1] 30 

Daten

x <- c(0,785,10273,6231,5417,2328,5249,1725,2656,6258,2687,2651,1063,325,2556,738,631,140,57, 
1173,407,225,135,69,81,21,16,3,0,26,1,2,0,1,2,1,1,0,0,3,1,0,0,0,1,0,0,0,0,1,0); 
+0

Ja, das ist richtig. Was, wenn ich auch überprüfen und sicherstellen möchte, dass alle anderen Datenpunkte dieser Regel entsprechen? Also alle anderen Punkte sind größer als 26. In diesem Beispiel wäre es Position 26. – Vedda

5

Sie verwenden können Position mit dem right=TRUE Argument, um zu vermeiden, vorwärts suchen zu müssen und dann das letzte Ergebnis zu nehmen:

Position(identity, diff(x) >= 26, right=TRUE) + 1 
#[1] 30 
+1

+1 Smart-Lösung, 'Position()' ist eine ziemlich obskure Funktion. Könnte es etwas beschleunigen, indem ich "isTRUE" durch "identity" ersetze. – bgoldst

Verwandte Themen