我经常遇到这样的问题:人们以某种方式以未命名字符 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
但是,当我们考虑使用更现代的软件包(例如
dplyr
或data.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.table
或data.frame
方法? 最佳答案
不确定效率,但使用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