【问题标题】:Error in bind_rows_(x, .id) : Argument 1 must have namesbind_rows_(x, .id) 中的错误:参数 1 必须有名称
【发布时间】:2019-03-01 12:50:15
【问题描述】:

这是一个代码sn-p:

y <- purrr::map(1:2, ~ c(a=.x))
test1 <- dplyr::bind_rows(y)
test2 <- do.call(dplyr::bind_rows, y)

第一次调用bind_rows (test1) 会产生错误

Error in bind_rows_(x, .id) : Argument 1 must have names

另一方面,使用do.call 调用bind_rows (test2) 可以正常工作:

test2
# A tibble: 2 x 1
      a
  <int>
1     1
2     2

为什么?这是使用 dplyr 0.7.6 和 purrr 0.2.5。如果我使用map_df 而不是map,则会失败并出现同样的错误。

注意:在我看来,这个问题与Error in bind_rows_(x, .id) : Argument 1 must have names using map_df in purrr 不同。

编辑:解决此问题的另一种方法是首先显式创建数据框:

y <- purrr::map(1:2, ~ data.frame(a=.x))

test1test2 现在创建时没有错误并且完全相同。

或者,这一步创建test2数据框:

purrr::map_df(1:2, ~ data.frame(a=.x))

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    如果您尝试将行绑定到矩阵而不是数据框,bind_rows() 也会输出错误 Error: Argument 1 must have names.。确保您没有将矩阵传递给它。

    【讨论】:

      【解决方案2】:

      来自bind_rows的文档:

      请注意,由于历史原因,包含向量的列表总是 视为数据帧。因此它们的向量被视为列 而不是行,它们的内部名称被忽略

      在这里,您的 y 构造只有内部名称 - 它是两个未命名的列表元素,每个包含一个长度为 1 的向量,向量元素名为 a。所以这个错误似乎是意料之中的。

      如果你命名列表元素,你可以看到它的行为与描述的一样,向量被视为列:

      library(tidyverse)
      y <- map(1:2, ~ c(a=.x)) %>%
        set_names(c("a", "b"))
      bind_rows(y)
      #> # A tibble: 1 x 2
      #>       a     b
      #>   <int> <int>
      #> 1     1     2
      

      通过do.call 提供y 作为参数的区别在于它更像是写bind_rows(c(a = 1), c(a = 2))。这不是包含向量的列表,而是单独的向量,因此它按预期按行绑定。

      【讨论】:

      • 谢谢。但是“内在名称”的定义是什么?那是指向量的名称属性吗?该术语不会出现在 R-ints、R-lang 或 R-intro 中。
      • 我相信它确实如此。我认为它不应该暗示除了列表元素内的事物名称之外的任何东西,而不是元素的名称。但是因为我们讨论的是向量列表,所以这意味着向量的名称。
      • 您的回答还解释了为什么 rbind 和 cbind 在这种情况下似乎向后工作。我没有提到它,但它非常令人困惑。 R中有很多曲折的边缘和黑暗的角落:-)
      猜你喜欢
      • 2018-07-08
      • 2020-01-10
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 2021-09-14
      • 2021-10-15
      相关资源
      最近更新 更多