【发布时间】:2021-05-05 11:03:27
【问题描述】:
这件事发生在我身上很多次了,我想找到一种更简单的方法来解决它。
我正在创建一个我希望它循环的函数。
假设我有以下列
id <- c(1, 1, 1, 2, 2, 2,
3, 3, 3, 4, 4, 4)
year <- c(2000, 2002, 2004,
2000, 2002, 2004,
2000, 2002, 2004,
2000, 2002, 2004)
pre.post <- c(0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1)
y <- c(100, 200, 200,
400, 500, 600,
700, 800, 300,
200, 100, 200)
df <- data.frame (id, year, pre.post, y)
我想要做的是将以下代码缩放到一个函数或循环中,以便我可以一次为year 的所有值运行它。
这就是我每年都想做的事情:
pacman::p_load(tidyverse, fixest)
df%>%
group_by(id)%>%
arrange(year)%>%
filter(dplyr::lag(pre.post) != 1)%>%
feols(y ~ pre.post| id + year, data = df, panel.id = ~id+year)
基本上,我希望 R 进入 year 的每个值并过滤掉那些滞后的 pre.post 为 1 的值,然后运行该模型。
我尝试了很多不同的 for 循环,例如:
for(i in unique(df$year)) {
year.df <- filter(df[year == i, ], lag(pre.post) != 1)
fixest::feols(y ~ pre.post| ags + year, data = year.df, panel.id = ~ags+year)
}
返回:
Error: object of type 'closure' is not subsettable
还有其他类似的东西,但我从来没有得到想要的东西。我认为问题基本上在于循环的过滤位。我也尝试创建自己的函数,这会更好,但我也没有得到它。提前非常感谢!
【问题讨论】:
标签: r function for-loop data.table tidyverse