R中滚动方式的重复向量

Duplicate Vector in Rolling Manner in R

说我想要 运行 一个回归,DV 的数据输入应该以滚动的方式进行。为了简化这个过程,我因此首先想"duplicate"那个向量,据此我相应地滚动观察。例如,请参见下面的数据结构。

# libraries #
library(dplyr)

# reproducible data # 
df1 <- tibble(ID = as.factor(rep(c(1, 2), each = 40)),
              YEAR = rep(rep(c(2001:2010), each = 4), 2),
              QTR = rep(c(1:4), 20),
              DV = rnorm(80))

df2 <- tibble(ID = as.factor(rep(c(1, 2), each = 120)),
              YEAR = rep(rep(c(2005:2010), each = 20), 2),
              IV = rnorm(240))

数据结构如此的原因是因为 df2 中的数据是早期执行的同样使用 .

的回归的残差

目标是 运行 一个模型,其中 df1 中的观察结果是 "rolled":

我解决这个问题的方法是尝试以滚动方式 "duplicate" df1,这样回归更容易执行。

目前我尝试通过 base 包中的函数 embed() 滚动它,但由于我的真实数据集要大得多,所以很快就会变得一团糟。会有优雅的 dplyr 替代品吗?

谢谢!

我们可以使用

v1 <- c(1, seq(5, nrow(df1), by = 4))
v2 <- seq(20, nrow(df1), by = 4)
i1 <- seq_len(min(c(length(v1), length(v2))))
lst1 <- map2(v1[i1], v2[i1], ~ df1 %>% 
                           slice(.x:.y))

类似地,使用 'df2'

执行此操作
v11 <- seq(1, nrow(df2), by = 20)
v22 <- seq(20, nrow(df2), by = 20)
i2 <- seq_len(min(c(length(v11), length(v22))))
lst2 <- map2(v11[i2], v22[i2], ~ df2 %>% 
                           slice(.x:.y))

然后使用 map2lists

的相应元素应用函数

更新

正如 OP 提到的关于按 'ID' 分组,一种选择是 group_split 按 'ID' 然后使用与上述相同的步骤

df1 %>%
    group_split(ID) %>% 
    map(~ {
      v1 <- c(1, seq(5, nrow(.x), by = 4))
      v2 <- seq(20, nrow(.), by = 4)
      i1 <- seq_len(min(c(length(v1), length(v2))))
      map2(v1[i1], v2[i1], function(x, y) .x %>%
           slice(x:y))
   })