Я часто нахожу вопросы, когда люди каким-то образом заканчивают список безымянных векторов безымянных символьных векторов, и они хотят связать их построчно в 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"
Один из типичных подходов - использование 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_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
Однако кажется, что шагов больше, чем нужно.
Следовательно, мой вопрос заключается в том, какой эффективный подход tidyverse
или data.table
к привязке безымянного списка безымянных символьных векторов в строку data.frame
-мудро?