Chcę utworzyć wiele opóźnień wielu zmiennych, więc pomyślałem, że pisanie funkcji byłoby pomocne. Mój kod generuje ostrzeżenie („obcinanie wektor do długości 1”) i fałszywe wyniki:debugowanie: funkcja tworzenia wielokrotnych opóźnień dla wielu kolumn (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)
Również zastanawiałem się, czy może istnieć bardziej eleganckie rozwiązanie wykorzystujące mutate_each
, ale nie dostałem tej pracy albo. Mogę oczywiście napisać długi kod z linią dla każdej zmiennej opóźnionej, ale chciałbym tego uniknąć.
EDIT:
akrun za dplyr odpowiedź działa, ale zajmuje dużo czasu, aby obliczyć dla dużych ramek danych. Rozwiązanie wykorzystujące data.table
wydaje się być bardziej wydajne. Tak więc dplyr lub inne rozwiązanie, które również może być zaimplementowane dla kilku kolumn &, wciąż można znaleźć.
EDIT 2:
przypadku wielu kolumn i bez grup (na przykład „id”) następujące rozwiązanie wydaje się bardzo dobrze nadaje się do mi, ze względu na jego prostotę. Kod może oczywiście ulec skróceniu, ale krok po kroku:
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)
Działa doskonale! Muszę tylko przeczytać na "data.table", aby móc poprawnie nim manipulować i pomyśleć o innych, którzy - jak ja - nie są bardzo wprawnymi programistami, rozwiązania 'dplyr' są łatwiejsze w zrozumieniu. – yoland
Zaktualizowałem za pomocą' danych. rozwiązanie tabeli w przypadku, gdy istnieje wiele kolumn, które chcesz zrobić 'shift' – akrun