【发布时间】:2016-06-30 09:36:23
【问题描述】:
我想创建多个变量的多个滞后,所以我认为编写一个函数会有所帮助。我的代码抛出警告(“将向量截断为长度 1”)和错误结果:
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解决方案更容易理解 -
我更新了
data.table解决方案,以防有很多列你想做shift