Ich möchte mehrere Verzögerungen von mehreren Variablen erstellen, so dass ich dachte, eine Funktion schreiben wäre hilfreich. Mein Code löst eine Warnung („Kürzen Vektor der Länge 1“) und falsche Ergebnisse:Debugging: Funktion zum Erstellen mehrerer Verzögerungen für mehrere Spalten (dplyr)
library(dplyr)
time <- c(2000:2009, 2000:2009)
x <- c(1:10, 10:19)
id <- c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2)
df <- data.frame(id, time, x)
three_lags <- function (data, column, group, ordervar) {
data <- data %>%
group_by_(group) %>%
mutate(a = lag(column, 1L, NA, order_by = ordervar),
b = lag(column, 2L, NA, order_by = ordervar),
c = lag(column, 3L, NA, order_by = ordervar))
}
df_lags <- three_lags(data=df, column=x, group=id, ordervar=time) %>%
arrange(id, time)
Auch fragte ich mich, ob es vielleicht eine elegantere Lösung mit mutate_each
sein, aber ich habe das auch nicht zu arbeiten. Ich kann natürlich nur einen langen Code mit einer Zeile für jede neue verzögerte Variable schreiben, aber ich möchte das vermeiden.
EDIT:
akrun des dplyr Antwort funktioniert, aber dauert eine lange Zeit für großen Datenrahmen zu berechnen. Die Lösung mit data.table
scheint effizienter zu sein. So ist ein dplyr oder eine andere Lösung, die auch die für mehrere Spalten implementierte & mehrere Lags erlaubt, noch zu finden.
EDIT 2:
Für mehrere Spalten und keine Gruppen (zum Beispiel „ID“) die folgende Lösung für mich sehr gut geeignet scheint, aufgrund seiner Einfachheit. Der Code kann natürlich verkürzt werden, sondern Schritt für Schritt:
df <- arrange(df, time)
df.lag <- shift(df[,1:24], n=1:3, give.names = T) ##column indexes of columns to be lagged as "[,startcol:endcol]", "n=1:3" sepcifies the number of lags (lag1, lag2 and lag3 in this case)
df.result <- bind_cols(df, df.lag)
Es funktioniert perfekt! Ich muss nur auf 'data.table' nachlesen, um es richtig bearbeiten zu können und für andere gedacht zu sein, die - wie ich - keine sehr fähigen Programmierer sind.' Dplyr' Lösungen sind einfacher zu verstehen – yoland
Ich habe mit den 'Daten aktualisiert. Tabelle "Lösung, wenn es viele Spalten gibt, die Sie die' Verschiebung' machen möchten – akrun