Ошибка в bind_rows_ (x, .id): аргумент 1 должен иметь имена - PullRequest
0 голосов
/ 25 сентября 2018

Вот фрагмент кода:

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, произойдет сбой с той же ошибкой.

Примечание: мне не кажется, что этот вопрос совпадает с Ошибка в bind_rows_ (x,.id): Аргумент 1 должен иметь имена, использующие map_df в purrr .

РЕДАКТИРОВАТЬ: Другой способ решения этой проблемы - явное создание кадра данных в первую очередь:

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

test1 и test2 теперь создаются без ошибок и являютсяидентичны.

В качестве альтернативы это создает фрейм данных test2 за один шаг:

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

1 Ответ

0 голосов
/ 25 сентября 2018

Из документации 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

Разница с предоставлениемy в качестве аргументов через do.call означает, что это больше похоже на написание bind_rows(c(a = 1), c(a = 2)).Это не список, содержащий векторы, а отдельные векторы, поэтому он связывается по строкам, как и ожидалось.

...