我想創建多個變量的多個滯後,所以我認爲編寫一個函數會有所幫助。我的代碼引發的警告(「截斷矢量長度1」)和錯誤的結果:調試:函數爲多列創建多個滯後(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)
此外,我想知道是否有可能使用mutate_each
一個更優雅的解決方案,但我沒有得到這工作的。我當然可以爲每個新的滯後變量寫一行代碼,但是我想避免這種情況。
編輯:
akrun的dplyr答案的工作,但需要較長的時間來計算的大數據幀。使用data.table
的解決方案似乎更有效。所以一個dplyr或其他的解決方案,也允許實現幾個列的幾個列還有待發現。
編輯2:
對於多個列,並且沒有基團(例如「ID」)以下的溶液似乎非常適合我,由於它的簡單性。該代碼,當然也可以縮短,但一步一步:
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)
它完美的工作!我只需要閱讀'data.table'就可以正確操作它,併爲其他像我這樣的人 - 認爲不是很熟練的程序員'dplyr'解決方案更容易理解 – yoland
我使用'data'進行了更新。表'的解決方案,如果有很多列你想要做'shift' – akrun