Voglio creare più ritardi di più variabili, quindi ho pensato di scrivere una funzione sarebbe utile. Il mio codice lancia un avvertimento ("Troncare vettore di lunghezza 1") e falsi risultati:debug: funzione per creare ritardi multipli per più colonne (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)
Inoltre mi sono chiesto se ci potrebbe essere una soluzione più elegante utilizzando mutate_each
, ma non ho avuto quello per funzionare neanche. Naturalmente posso semplicemente scrivere un lungo codice con una linea per ogni nuova variabile ritardata, ma Id mi piace evitarlo.
EDIT: risposta dplyr
di akrun funziona, ma richiede molto tempo per calcolare per grandi frame di dati. La soluzione che utilizza data.table
sembra essere più efficiente. Quindi un dplyr o un'altra soluzione che consente anche l'implementazione per più colonne & diversi ritardi deve ancora essere trovato.
EDIT 2:
Per più colonne e gruppi (ad esempio "ID") la seguente soluzione sembra molto adatta a me, grazie alla sua semplicità. Il codice può ovviamente essere abbreviato, ma passo dopo passo:
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)
Funziona perfettamente! Devo solo leggere su 'data.table' per essere in grado di manipolarlo correttamente e pensato per gli altri che - come me - non sono programmatori molto esperti. Le soluzioni' dplyr' sono più facili da comprendere – yoland
Ho aggiornato con 'data. table' solution nel caso in cui ci siano molte colonne che vuoi fare 'shift' – akrun