1. ホーム
  2. r

[解決済み] bind_rows_(x, .id) のエラー : 引数 1 には名前を指定する必要があります。

2022-02-12 11:06:18

質問

以下はコードスニペットです。

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 .

EDIT: この問題に対処するもう一つの方法は、そもそも明示的にデータフレームを作成することです。

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

test1test2 はエラーもなく、同じものが作成されるようになりました。

または、これは test2 のデータフレームを一度に作成することができます。

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

解決方法は?

のドキュメントから bind_rows :

歴史的な理由により、ベクトルを含むリストは常に はデータフレームとして扱われる。したがって、そのベクトルは列として扱われます 行ではなく、内側の名前は無視されます。

ここで、あなたの y これは2つの無名のリスト要素で、それぞれが長さ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

を指定した場合との違い y を経由して引数として do.call という書き方は、どちらかというと bind_rows(c(a = 1), c(a = 2)) . これはベクターを含むリストではなく、別々のベクターなので、期待通り行単位でバインドされます。