【发布时间】: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)
以上运行良好,但我想添加另一个管道 %>% 和 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,谢谢。现在我正在查看它,如何在运行
cbind或bind_cols时以编程方式从df1中排除重复的列? -
使用
augment(modRes) %>% select(-c(.se.fit, .hat, .sigma, .cooksd, std.resid)) %>% merge(df1, .)防止列重复(并获得所需的列顺序)。merge()实现了 SQL joins 的想法,而不是cbind/rbind所做的按轴(与内容无关)螺栓/绑定对象。