【问题标题】:r: select(everything()) not working with broom::augment for modeling resultsr: select(everything()) 不适用于 broom::augment 建模结果
【发布时间】:2019-02-01 20:46:17
【问题描述】:

我希望从线性模型结果lm 中创建一个干净的数据框,其中包含重新编排的列,我的最终目标是将数据框写入 excel 以绘制图表并审计模型残差。一、样本数据:

df1 <- cbind.data.frame(dt = seq.Date(as.Date('2019-01-01'),
                                      as.Date('2019-01-10'),
                                      by = 'day' ),
                        depVar = rnorm(10,2,1),
                        indepVar1 = rnorm(10,4,3),
                        indepVar2 = rnorm(10,7,2)
        )

现在运行模型:

modRes <- lm(depVar~ indepVar1, data=df1)

avf1 <- broom::augment(modRes)

library(dplyr)

avf1 <- avf1 %>% 
    # drop what we don't need
    select(-c(.se.fit, .hat, .sigma, .cooksd, .std.resid)) %>% 
    cbind(df1) 

以上运行良好,但我想添加另一个管道 %&gt;%select(dt, everything()),以便我可以重新排序列。以下返回错误:

avf1 <- avf1 %>% 
  select(-c(.se.fit, .hat, .sigma, .cooksd, .std.resid)) %>% # drop what we don't need
  cbind(df1) %>% 
  select(dt, everything())

Error: Can't bind data because some arguments have the same name
Call `rlang::last_error()` to see a backtrace

为什么会失败?

【问题讨论】:

  • 因为一旦您cbind(df1),您就有多个列名为“depVar”和“indepVar1”。改用dplyr::bind_cols()自动添加“唯一”后缀即可解决问题
  • @Nate,谢谢。现在我正在查看它,如何在运行cbindbind_cols 时以编程方式从df1 中排除重复的列?
  • 使用augment(modRes) %&gt;% select(-c(.se.fit, .hat, .sigma, .cooksd, std.resid)) %&gt;% merge(df1, .) 防止列重复(并获得所需的列顺序)。 merge() 实现了 SQL joins 的想法,而不是 cbind/rbind 所做的按轴(与内容无关)螺栓/绑定对象。

标签: r dplyr broom


【解决方案1】:
avf1 <- modRes %>%
  augment() %>% 
  select(-c(.se.fit, .hat, .sigma, .cooksd, .std.resid)) %>% 
  bind_cols(df1) %>% 
  select(dt, everything())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 2020-12-25
    • 2016-04-05
    • 2020-11-21
    • 2018-08-13
    • 2016-10-11
    • 2019-05-25
    • 2014-03-14
    相关资源
    最近更新 更多