我经常遇到这样的问题:人们以某种​​方式以未命名字符 vector 的未命名列表结尾,他们想将它们按行绑定(bind)到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"

一种典型的方法是使用基数R中的do.call
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

可能不太有效的方法是使用基数R中的Reduce
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

但是,当我们考虑使用更现代的软件包(例如dplyrdata.table)时,由于 vector 未命名或不在列表中,因此可能立即想到的某些方法不起作用。
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

一种方法可能是对 vector 进行set_names
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

但是,这似乎比需要的步骤更多。

因此,我的问题是什么是将未命名字符 vector 的未命名列表按行绑定(bind)到tidyverse的有效data.tabledata.frame方法?

最佳答案

不确定效率,但使用purrrtibble的紧凑选项可能是:

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

08-24 18:05