2017-07-04 3 views
-1

Ich habe versucht, Verzögerung auf einer Spalte eines Datenrahmens zu verwenden, aber wenn Zeit beteiligt ist, wird es einfach nicht funktionieren. Ich habe Shift, Lag und Tlag ausprobiert.R Blei und Verzögerung (Verschiebung) mit Zeiten

Beispiel:

y = strptime(sprintf("%s:%s:%s", 4, 20, 10), "%H:%M:%S") 
yy = strptime(sprintf("%s:%s:%s", 10, 20, 10), "%H:%M:%S") 
lag(c(y,yy)) 

Fehler in format.POSIXlt (x, usetz = usetz): ungültige Komponente [[10]] in "POSIXlt" sollte 'Zone'

tlag(c(y,yy))

Fehler in n_distinct_multi (Liste (...), na.rm): Argument „Zeit“ fehlt, ohne Standard

shift(c(y,yy)) 
[[1]] 
[1] NA 10 

[[2]] 
[1] NA 20 

[[3]] 
[1] NA 4 

[[4]] 
[1] NA 4 

[[5]] 
[1] NA 6 

[[6]] 
[1] NA 117 

[[7]] 
[1] NA 2 

[[8]] 
[1] NA 184 

[[9]] 
[1] NA 1 

[[10]] 
[1] NA "BST" 

[[11]] 
[1] NA 3600 

Ich habe keine Zeitdifferenzen will, ich will einfach den Wert aus der Zeile oben in meinem Datenrahmen, die ich dachte, war das, was liegt tat : "Lead und Lag sind nützlich für den Vergleich von Werten, die um eine Konstante versetzt sind (z. B. der vorherige oder nächste Wert) ". Die Zeit sollte nicht einmal von Bedeutung sein, sie sollte einfach das Numerische/Zeichen/Zeit von der vorherigen Position wählen. Wie repariere ich das oder gibt es eine andere Funktion, die das Äquivalent von dem was ich mache d‘- ich habe keine Schleifen einbeziehen will als die Geschwindigkeit wichtig ist und die Datenrahmen sind groß

Beispiel aus meinem Datenrahmen.

structure(list(sec = c(52, 53, 54, 55, 56, 57, 58, 59, 0, 1), 
    min = c(50L, 50L, 50L, 50L, 50L, 50L, 50L, 50L, 51L, 51L), 
    hour = c(11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L 
    ), mday = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), mon = c(6L, 
    6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), year = c(117L, 117L, 
    117L, 117L, 117L, 117L, 117L, 117L, 117L, 117L), wday = c(2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), yday = c(184L, 184L, 
    184L, 184L, 184L, 184L, 184L, 184L, 184L, 184L), isdst = c(1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), zone = c("BST", "BST", 
    "BST", "BST", "BST", "BST", "BST", "BST", "BST", "BST"), 
    gmtoff = c(NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_, 
    NA_integer_)), .Names = c("sec", "min", "hour", "mday", "mon", 
"year", "wday", "yday", "isdst", "zone", "gmtoff"), class = c("POSIXlt", 
"POSIXt")) 
+1

hinzufügen würde es besser sein, ein reproduzierbares Beispiel schreiben den Datenrahmen enthält, die Sie im Text erwähnen. Mein Verdacht ist, dass das, was Sie gerne tun würden, ziemlich geradlinig ist, mit einem sauberen Ansatz, der Mutate und Lag verwendet, aber im Moment ist es schwer zu sehen. – JanLauGe

+0

Was ist die erwartete Ausgabe? – AK88

+0

Nun, der Datenrahmen würde genauso funktionieren wie der obige Vektor, der einen Fehler statt der erwarteten "NA" anzeigt. 2017-07-04 04:20:10 BST "' – Olivia

Antwort

1

Für ein data.frame wie unter

index    time 
1  1 2017-07-04 04:20:10 
2  2 2017-07-04 10:20:10 

können Sieverwenden

dplyr::lag(df$time, 1) 
[1] NA       "2017-07-04 04:20:10 CEST" 

dplyr::lead(df$time, 1) 
[1] "2017-07-04 10:20:10 CEST" NA   

Und die Führungs-/Verzögerungs-Spalte zu Ihrem data.frame Sie verwenden können

dplyr::mutate(df, lead_1 = dplyr::lead(time, 1), lag_1 = dplyr::lag(time, 1)) 
    index    time    lead_1    lag_1 
1  1 2017-07-04 04:20:10 2017-07-04 10:20:10    <NA> 
2  2 2017-07-04 10:20:10    <NA> 2017-07-04 04:20:10   
+0

Warum funktioniert die Verwendung von POSIXlt innerhalb von muate, aber ohne muate muss ich in POSIXct konvertieren? – Olivia

Verwandte Themen