R函数用于创建,命名和滞后变量

时间:2018-03-20 22:07:13

标签: r function lag

我有一些类似的数据:

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.lag1b.lag1c.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。感谢。

4 个答案:

答案 0 :(得分:2)

轻松使用dplyr。不要调用数据帧df,可能会导致与同名函数混淆。我使用df1

library(dplyr)
df1 <- df1 %>%
  mutate(a.lag1 = lag(a),
         b.lag1 = lag(b),
         c.lag1 = lag(c))

答案 1 :(得分:2)

问题中的数据框语句无效,因为abc的长度不同。你可以做的是创建一个动物园系列。请注意,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)])
}