【问题标题】:Scaling up filtering and function to for loop in R将过滤和函数按比例放大到 R 中的 for 循环
【发布时间】: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.post1 的值,然后运行该模型。

我尝试了很多不同的 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


    【解决方案1】:

    你需要这样的东西吗?

    library(dplyr)
    
    df %>%
      filter(lag(pre.post) != 1) %>%
      group_by(year) %>%
      summarise(test = list(feols(y ~ pre.post| id + year, data = cur_data_all(), 
                            panel.id = ~id+year))) -> result
    

    【讨论】:

    • 是的,看起来不错。我认为,如果我能够在每一年都扩大规模,那将是可行的。但是,当我按原样运行它时,它给了我来自 fixeols 函数的错误“错误:summarise() 输入问题test。x 固定效应变量年不在数据中。”,这不是真的
    • 使用cur_data_all() 而不是cur_data()
    • 哦,现在我得到了结果列表,谢谢!我不太明白的问题是:过滤器命令是否分别为每个组运行?因为这就是我一直在寻找的
    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    相关资源
    最近更新 更多