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":
- 回归 1:DV = df1 中的第 1-20 行,IV = df2 中的第 1-20 行
- 回归 2:DV = df1 中的第 5-25 行,IV = df2 中的第 21-40 行
- 回归 3:DV = df1 中的第 10-30 行,IV = df2 中的第 41-60 行
- 等等
我解决这个问题的方法是尝试以滚动方式 "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))
然后使用 map2
对 list
s
的相应元素应用函数
更新
正如 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))
})
说我想要 运行 一个回归,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":
- 回归 1:DV = df1 中的第 1-20 行,IV = df2 中的第 1-20 行
- 回归 2:DV = df1 中的第 5-25 行,IV = df2 中的第 21-40 行
- 回归 3:DV = df1 中的第 10-30 行,IV = df2 中的第 41-60 行
- 等等
我解决这个问题的方法是尝试以滚动方式 "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))
然后使用 map2
对 list
s
更新
正如 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))
})