2016-05-20 23 views
1

Meine Aufgabe ist es, aufeinanderfolgende Werte in einem Datenrahmen unterhalb einer bestimmten Schwelle zu finden. Zuerst habe ich eine Teilmenge aus einem Datenrahmen mit Werten niedriger als der Schwellenwert extrahiert. Jetzt sehen meine Daten so aus:R, find, dates, konsekutiv

Value  dates 
5105.47  1970-03-25 
5398.53  1970-04-08 
5520.65  1970-04-09 
5052.68  1970-04-10 
5406.77  1970-04-11 
5501.05  1970-04-12 

Das Ergebnis ist im Grunde eine unregelmäßige Zeitreihe. Jetzt möchte ich die aufeinanderfolgenden Daten identifizieren. Irgendwelche Vermutungen darüber, wie es geht?

+0

Was das gewünschte Ergebnis in Ihrem Fall wäre? Hast du 'diff' probiert? –

Antwort

3

können Sie

df1$consecutive <- c(NA,diff(as.Date(df1$dates))==1) 
# > df1 
#  Value  dates consecutive 
# 1 5105.47 1970-03-25   NA 
# 2 5398.53 1970-04-08  FALSE 
# 3 5520.65 1970-04-09  TRUE 
# 4 5052.68 1970-04-10  TRUE 
# 5 5406.77 1970-04-11  TRUE 
# 6 5501.05 1970-04-12  TRUE 

versuchen, die Zeichenkette in Date Format wird es möglich, einfache Operationen durchzuführen, wie wenn man den Unterschied zwischen zwei Daten Durch die Umwandlung. Die Funktion diff() nimmt einen Vektor als Eingabe und berechnet die Differenz zwischen jedem Eintrag v[i] des Vektors und seinem vorherigen Eintrag v[i-1]. Der Differenzvektor hat offensichtlich einen Eintrag weniger als der ursprüngliche Vektor. Da es unmöglich ist, zu bestimmen, ob das erste Datum in dem data.frame fortlaufend ist oder nicht, kann seine Kennung vernünftigerweise auf NA gesetzt werden.

Im Fall von Daten, wenn die Differenz gleich 1 ist, sind die Tage aufeinanderfolgend und der Vergleich diff(as.Date(df1$dates))==1) ergibt TRUE.

Daten

df1 <- structure(list(Value = c(5105.47, 5398.53, 5520.65, 5052.68, 
      5406.77, 5501.05), dates = structure(1:6, .Label = c("1970-03-25", 
      "1970-04-08", "1970-04-09", "1970-04-10", "1970-04-11", "1970-04-12"), 
      class = "factor")), .Names = c("Value", "dates"), 
      class = "data.frame", row.names = c(NA, -6L)) 
+0

Schön, obwohl ich df1 $ Daten mit seiner Datum-formatierten Version überschreiben würde, anstatt es nur im laufenden Betrieb zu tun. – Frank

+1

Danke @Frank. Ich stimme zu, und ich würde wahrscheinlich das Gleiche tun. Aber ich habe eine allgemeine Vorliebe für SO für One-Liner-Typ-Antworten bemerkt ;-) – RHertel