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

R function for creating, naming and lagging variables

我有一些这样的数据:

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 添加到原始 df。谢谢。

易于使用dplyr。不要调用数据框df,可能会与同名函数混淆。我正在使用 df1.

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

问题中的数据框语句无效,因为 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

我们可以使用mutate_all

library(dplyr)
df %>% 
   mutate_all(funs(lag = lag(.)))

如果一切都失败了,您可以使用一个简单的基本 R 函数:

my_lag <- function(x, steps = 1) {
  c(rep(NA, steps), x[1:(length(x) - steps)])
}