我有一些类似的数据:
a <- c(1, 2, 9, 18, 6, 45)
b <- c(12, 3, 34, 89, 108, 44)
c <- c(0.5, 3.3, 2.4, 5, 13,2)
df <- data.frame(a, b,c)
我需要创建一个函数来同时滞后很多变量,以便对包含许多变量的非常大的时间序列进行分析。所以我需要在不输入所有变量的情况下滞后很多变量。简而言之,我想创建变量a.lag1
,b.lag1
和c.lag1
,并能够将它们添加到上面指定的原始df
。我认为最好的方法是创建一个自定义函数,类似于:
lag.fn <- function(x) {
assign(paste(x, "lag1", sep = "."), lag(x, n = 1L)
return (assign(paste(x, "lag1", sep = ".")
}
所需的输出是:
a.lag1 <- c(NA, 1, 2, 9, 18, 6, 45)
b.lag1 <- c(NA, 12, 3, 34, 89, 108, 44)
c.lag1 <- c(NA, 0.5, 3.3, 2.4, 5, 13, 2)
然而,我无法得到我想要的东西。我应该将环境改变为全球环境吗?我希望能够使用cbind
添加到orignal df
。感谢。
答案 0 :(得分:2)
轻松使用dplyr
。不要调用数据帧df
,可能会导致与同名函数混淆。我使用df1
。
library(dplyr)
df1 <- df1 %>%
mutate(a.lag1 = lag(a),
b.lag1 = lag(b),
c.lag1 = lag(c))
答案 1 :(得分:2)
问题中的数据框语句无效,因为a
,b
和c
的长度不同。你可以做的是创建一个动物园系列。请注意,lag.zoo
中指定的延迟可以是滞后矢量,如下面的第二个示例所示。
library(zoo)
z <- merge(a = zoo(a), b = zoo(b), c = zoo(c))
lag(z, -1) # lag all columns
lag(z, 0:-1) # each column and its lag
答案 2 :(得分:1)
我们可以使用mutate_all
library(dplyr)
df %>%
mutate_all(funs(lag = lag(.)))
答案 3 :(得分:1)
如果其他一切都失败了,你可以使用一个简单的基本R函数:
my_lag <- function(x, steps = 1) {
c(rep(NA, steps), x[1:(length(x) - steps)])
}