【发布时间】:2018-03-16 23:49:01
【问题描述】:
背景
我有一个函数,它采用data.frame,估计模型并返回模型强化的原始数据。
我目前所拥有的
如果输入数据已经分组,我依靠left_join 使用分组变量作为要加入的列。但是,如果有 no 分组,left_join 将不起作用,因为没有可加入的列。我想避免创建一个虚拟变量,因为这意味着我必须决定一个可能已经存在于数据中的列名。因此,我认为我可以依靠bind_cols。但是,由于第二个tibble 中有list 列,所以bind_cols 将不起作用。
问题
- 整个
if(is.grouped_df(.))方法感觉有点hackish。是 有“更好”的方法来实现相同的目标吗? - 我怎么能
bind_cols什么时候 第二个data_frame / tibble包含list列?
代码
library(dplyr)
g <- function(mdat) {
## am/mpg hard coded in this toy example
addDat <- mdat %>%
do(mod = lm(mpg ~ am, .), data = (.))
if (is.grouped_df(mdat)) {
left_join(mdat, addDat, by = group_vars(mdat))
} else {
bind_cols(mdat, addDat)
}
}
g(mtcars) ## does not work
# Error in cbind_all(x) : Argument 2 must be length 1, not 32
g(mtcars %>% group_by(vs)) ## works as expected
【问题讨论】:
-
换个
bind_cols(as_tibble(mtcars), addDat[rep(1, nrow(mtcars)),])怎么样 -
不错的一个! +1。您将如何处理分组/未分组的输入?您会使用
if子句来执行left_join或bind_cols吗? -
我不确定的一件事是,为什么您需要将“数据”存储在
list中,其中每一行都将存储整个数据,而且似乎存储的数据超出了需要,而且速度很慢 -
好点。嗯,在后面的步骤中,我想使用模型中的一些统计数据来转换数据中的一些列。如果模型不是
data_frame的一部分,我需要在mutate中执行查找。仔细想想,这可能确实是更好的选择。您是否介意将您的评论作为答案,我可以接受。 -
我又想了想。
bind_cols / left_join选项使在随后的mutate调用中更容易引用正确的模型,并且我不必构造复杂的查找结构。由于我的模型已经在tibble中,所以我在考虑从这个小标题中过滤和提取正确的模型(在存在预分组的情况下更糟)与简单地使用同一行中的模型时感到有些头疼。