【问题标题】:group_by() in list of data frames数据框列表中的 group_by()
【发布时间】:2021-06-14 12:48:44
【问题描述】:

我想:

  1. 将列表 out 与数据框 df 合并
  2. 估计一个 lm() 模型
id <- c(1,2,3,4,5,1,2,3,4,5)
quarter <- c("1","2","1","1","2", "3","1","1","3","3")
month <- c(3,4,2,1,5,7,3,1,8,9)
pred_dif <- c(0.5,0.1,0.15,0.23,0.75,0.6,0.49,0.81,0.37,0.14)

list_1 <- data.frame(id, pred_dif, month)

pred_dif <- c(0.45,0.18,0.35,0.63,0.25,0.63,0.29,0.11,0.17,0.24)

list_2 <- data.frame(id, pred_dif, month)

pred_dif <- c(0.58,0.13,0.55,0.13,0.76,0.3,0.29,0.81,0.27,0.04)

list_3 <- data.frame(id, pred_dif, month)

pred_dif <- c(0.3,0.61,0.18,0.29,0.85,0.76,0.56,0.91,0.48,0.91)

list_4 <- data.frame(id, pred_dif, month)

out <- list(list_1, list_2, list_3, list_4)


pred_second <- c(0.4,0.71,0.28,0.39,0.95,0.86,0.66,0.81,0.58,0.81)
df <- data.frame(id, quarter, pred_second, month)



library(purrr)
library(dplyr)
library(broom)
library(tidyr)
lmout_lst <- map(out, 
                 ~ left_join(.x, df, by = c('id', 'month')) %>%
                   group_by(quarter) %>%
                   summarise(new = list(lm(pred_dif ~ as.factor(month) - 1) %>% 
                                          broom::tidy(.))) %>%
                   unnest(new))

问题发生在 ols_list_reg 中。特别是使用“group_by”命令。

知道为什么会发生这种情况以及可能的解决方案吗?

【问题讨论】:

  • 谢谢@Ronak 如果您现在尝试,代码不会真的失败out[[1]] %&gt;% filter(quarter == '1') %&gt;% {lm(pred_dif ~ as.factor(month) - 1, data = .)}

标签: r list dataframe group-by


【解决方案1】:

或许,你可以试试这个——

library(tidyverse)

map(out, 
    ~ left_join(.x, df, by = c('id', 'month')) %>%
      group_by(quarter) %>%
      summarise(new = list({
            tryCatch(lm(pred_dif ~ as.factor(month) - 1) %>% broom::tidy(.), 
                     error = function(e) tibble(estimate = NA))
        })) %>%
      unnest(new)
)

如果要将所有结果组合在一起,请使用 map_df 而不是 map

【讨论】:

  • 感谢@Ronak!将季度包含在列表out中是我的错误吗?变量季度仅属于数据框 df。只有在 merge 列表和数据框之后,我们才能在列表 out 中拥有变量“季度”。因此,在我原来的任务中不可能按 季度 合并
  • 这样你就可以将它从by 中的left_join 中删除。
  • 出于任何原因,这在我设计的示例中起作用,但在我的真实数据下不起作用Error: Problem with `summarise()` input `new`. x contrasts can be applied only to factors with 2 or more levels ℹ Input `new` is `list(lm(TE_indiv ~ as.factor(size) - 1) %&gt;% broom::tidy(.))`. ℹ The error occurred in group 5: quarter = NA. 在我的真实情况下,size 是一个字符变量。如果我按 month 分组,所有流程都正常进行,如果我按 季度 分组,则流程会在以下错误下损坏。碰巧字符向量 quarter 没有 NA。有什么想法吗?
  • 在这种情况下,您必须使用tryCatch 来捕获这些错误。看看我更新的答案是否对您的真实数据有帮助。
【解决方案2】:

正如@RonakShah 所说,您的代码对于列表的单个元素失败。完全不清楚您要达到的目标,但是

out %>% 
  bind_rows(.id="element") %>% 
  left_join(df, by=c("id", "period")) %>% 
  mutate(period=as.factor(period)) %>% 
  group_by(element) %>% 
  group_map(function(.x, .y) lm(pred_dif ~ period-1, data=.x))

至少在没有警告或错误的情况下运行,并给出可能合理的输出:

[[1]]

Call:
lm(formula = pred_dif ~ period - 1, data = .x)

Coefficients:
period01  period02  period08  period09  period11  period12  
   0.365     0.600     0.620     0.100     0.370     0.412  


[[2]]

Call:
lm(formula = pred_dif ~ period - 1, data = .x)

Coefficients:
period01  period02  period08  period09  period11  period12  
   0.540     0.630     0.270     0.180     0.170     0.232  


[[3]]

Call:
lm(formula = pred_dif ~ period - 1, data = .x)

Coefficients:
period01  period02  period08  period09  period11  period12  
   0.355     0.300     0.525     0.130     0.270     0.552  


[[4]]

Call:
lm(formula = pred_dif ~ period - 1, data = .x)

Coefficients:
period01  period02  period08  period09  period11  period12  
   0.295     0.760     0.705     0.610     0.480     0.618

【讨论】:

  • 谢谢@Limey。我想我没有设法解释这一点。目的是通过使用每个季度包含的month变量来解释pred_dif
  • 我仍然不知道你想要达到什么目的。我建议您提供您的预期输出,并为out 列表中的单个元素定义您希望实现的流程以获得输出。这可能会给我们一个实施它的机会。 (而且,它可能会向您展示如何自己实现您想要的结果。)
  • 我希望得到如下相同的输出:lmout_lst &lt;- map(out, ~ left_join(.x, df, by = c('id', 'month')) %&gt;% #group_by(quarter) %&gt;% summarise(new = list(lm(pred_dif ~ as.factor(month) - 1) %&gt;% broom::tidy(.))) %&gt;% unnest(new)) 但“估计”4 次(每季度一次)而不是每个“元素”一次
猜你喜欢
  • 2021-11-09
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 2013-10-10
  • 1970-01-01
  • 2017-07-09
  • 2011-06-18
相关资源
最近更新 更多