名前のないベクトルの名前のないリストを行でバインドする Tidyverse アプローチ - do.call(rbind,x) と同等 質問する

名前のないベクトルの名前のないリストを行でバインドする Tidyverse アプローチ - do.call(rbind,x) と同等 質問する

私はよく、人々がどういうわけか名前なしリスト名前なし文字ベクトルがあり、それを行ごとに にバインドしたいと考えていますdata.frame。次に例を示します。

library(magrittr)
data <- cbind(LETTERS[1:3],1:3,4:6,7:9,c(12,15,18)) %>%
  split(1:3) %>% unname
data
#[[1]]
#[1] "A"  "1"  "4"  "7"  "12"
#
#[[2]]
#[1] "B"  "2"  "5"  "8"  "15"
#
#[[3]]
#[1] "C"  "3"  "6"  "9"  "18"

典型的なアプローチの 1 つは、do.callベース R を使用することです。

do.call(rbind, data) %>% as.data.frame
#  V1 V2 V3 V4 V5
#1  A  1  4  7 12
#2  B  2  5  8 15
#3  C  3  6  9 18

Reduceおそらく、ベース R を使用する方法はそれほど効率的ではありません。

Reduce(rbind,data, init = NULL) %>% as.data.frame
#  V1 V2 V3 V4 V5
#1  A  1  4  7 12
#2  B  2  5  8 15
#3  C  3  6  9 18

dplyrただし、やなどのより現代的なパッケージを検討する場合data.table、ベクトルに名前が付いていないかリストではないため、すぐに思い浮かぶアプローチのいくつかは機能しません。

library(dplyr)
bind_rows(data)
#Error: Argument 1 must have names
library(data.table)
rbindlist(data)
#Error in rbindlist(data) : 
#  Item 1 of input is not a data.frame, data.table or list

set_names1 つのアプローチとしては、ベクトルを使用する方法があります。

library(purrr)
map_df(data, ~set_names(.x, seq_along(.x)))
# A tibble: 3 x 5
#  `1`   `2`   `3`   `4`   `5`  
#  <chr> <chr> <chr> <chr> <chr>
#1 A     1     4     7     12   
#2 B     2     5     8     15   
#3 C     3     6     9     18  

しかし、これは必要以上に多くの手順を要するように思えます。

したがって、私の質問tidyversedata.table名前なしリスト名前なし文字ベクトルをdata.frame行単位に変換しますか?

ベストアンサー1

purrr効率については完全にはわかりませんが、とを使用したコンパクトなオプションはtibble次のようになります。

map_dfc(purrr::transpose(data), ~ unlist(tibble(.)))

  V1    V2    V3    V4    V5   
  <chr> <chr> <chr> <chr> <chr>
1 A     1     4     7     12   
2 B     2     5     8     15   
3 C     3     6     9     18  

おすすめ記事