说我想运行一个回归,该回归应以滚动方式获取DV的数据输入。因此,为了简化此过程,我首先想"复制"该向量,从而相应地进行观察。例如,请参见下面的数据结构。
# 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中的观察值是"滚动"的:
- 回归1:dv = df1中的1-20行,iv = df2中的1-20行
- 回归2:dv = df1中的第5-25行,iv =行21-40 in df2
- 回归3:dv = df1中的10-30行,iv =行41-60 in df2
- 等等
我解决这个问题的方式是尝试以滚动方式"重复" 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))
然后使用map2
在两个list
S
更新
正如" ID"分组的OP所述,一个选项是 group_split
by" 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))
})