下面是一个代码片段:
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))
现在创建的test1
和test2
没有错误,并且是相同的。
或者,这将在一个步骤中创建test2
数据框:
purrr::map_df(1:2, ~ data.frame(a=.x))
发布于 2018-09-25 20:14:17
来自bind_rows
的文档
请注意,由于历史原因,包含向量的列表始终被视为数据帧。因此,它们的向量被视为列而不是行,并且它们的内部名称被忽略
在这里,构建的y
只有内部名称-它是两个未命名的列表元素,每个元素都包含一个长度-一个向量具有名为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))
。这不是一个包含向量的列表,而是单独的向量,因此它按预期按行绑定。
发布于 2021-03-02 20:58:36
如果您尝试将行绑定到矩阵而不是数据框,bind_rows()
也会输出错误Error: Argument 1 must have names.
。确保你没有传递给它一个矩阵。
https://stackoverflow.com/questions/52505923
复制