这是一个代码片段:
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_rows(test1)会产生错误
Error in bind_rows_(x, .id) : Argument 1 must have names
Run Code Online (Sandbox Code Playgroud)
另一方面,使用do.call来调用bind_rows(test2)可以按预期工作:
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)
从以下文档中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))。这不是包含向量的列表,而是单独的向量,因此按预期按行绑定。
| 归档时间: |
|
| 查看次数: |
8800 次 |
| 最近记录: |