【问题标题】:bind_cols when one data_frame contains list column当一个 data_frame 包含列表列时的 bind_cols
【发布时间】:2018-03-16 23:49:01
【问题描述】:

背景

我有一个函数,它采用data.frame,估计模型并返回模型强化的原始数据。

我目前所拥有的

如果输入数据已经分组,我依靠left_join 使用分组变量作为要加入的列。但是,如果有 no 分组,left_join 将不起作用,因为没有可加入的列。我想避免创建一个虚拟变量,因为这意味着我必须决定一个可能已经存在于数据中的列名。因此,我认为我可以依靠bind_cols。但是,由于第二个tibble 中有list 列,所以bind_cols 将不起作用。

问题

  1. 整个if(is.grouped_df(.)) 方法感觉有点hackish。是 有“更好”的方法来实现相同的目标吗?
  2. 我怎么能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_joinbind_cols 吗?
  • 我不确定的一件事是,为什么您需要将“数据”存储在 list 中,其中每一行都将存储整个数据,而且似乎存储的数据超出了需要,而且速度很慢
  • 好点。嗯,在后面的步骤中,我想使用模型中的一些统计数据来转换数据中的一些列。如果模型不是data_frame 的一部分,我需要在mutate 中执行查找。仔细想想,这可能确实是更好的选择。您是否介意将您的评论作为答案,我可以接受。
  • 我又想了想。 bind_cols / left_join 选项使在随后的mutate 调用中更容易引用正确的模型,并且我不必构造复杂的查找结构。由于我的模型已经在tibble 中,所以我在考虑从这个小标题中过滤和提取正确的模型(在存在预分组的情况下更糟)与简单地使用同一行中的模型时感到有些头疼。

标签: r dplyr


【解决方案1】:

为了使函数正常工作,我们可以复制 'addDat' 中的行

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(as_tibble(mdat), addDat[rep(1, nrow(mdat)),])
    }
}

g(mtcars)

注意:但是,将整个数据集存储为每一行的 list 效率会低下

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-12
    • 2019-05-07
    • 1970-01-01
    • 2021-07-28
    • 2013-12-15
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    相关资源
    最近更新 更多