bind_rows_(x,.id)中的错误:参数1必须具有名称

Rob*_*ald 6 r dplyr tidyverse

这是一个代码片段:

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

第一次调用bind_rowstest1)会产生错误

Error in bind_rows_(x, .id) : Argument 1 must have names
Run Code Online (Sandbox Code Playgroud)

另一方面,使用do.call来调用bind_rowstest2)可以按预期工作:

test2
# A tibble: 2 x 1
      a
  <int>
1     1
2     2
Run Code Online (Sandbox Code Playgroud)

为什么?这使用的是dplyr 0.7.6和purrr 0.2.5。如果我使用map_df代替map,它将失败,并显示相同的错误。

注意:在我看来,这个问题与bind_rows_(x,.id)中的错误并不相同:参数1必须具有在purrr中使用map_df的名称

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

y <- purrr::map(1:2, ~ data.frame(a=.x))
Run Code Online (Sandbox Code Playgroud)

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

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

purrr::map_df(1:2, ~ data.frame(a=.x))
Run Code Online (Sandbox Code Playgroud)

Meg*_*ron 6

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


Cal*_*You 5

从以下文档中bind_rows

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

在这里,您的yas构造只有内部名称-它是两个未命名的列表元素,每个元素都包含一个长度为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
Run Code Online (Sandbox Code Playgroud)

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