Използвайте bind_rows, за да конвертирате списък с вектори в рамка с данни

Имам списък с вектори, които бих искал да конвертирам в рамка с данни.

Код

a <- list( c(1,2,3,4), 
           c(1,2,3,4), 
           c(4,5,6,3), 
           c(6,3,2,6))

С помощта на тази публикация успях да го направя в по следния начин:

library(tidyverse)
a %>% 
   reduce(rbind) %>% 
   as.data.frame()

> a %>% reduce(rbind) %>% as.data.frame()
      V1 V2 V3 V4
out    1  2  3  4
elt    1  2  3  4
elt.1  4  5  6  3
elt.2  6  3  2  6

Бих искал да използвам функцията bind_rows() на purrr (a %>% bind_rows), тъй като изглежда по-удобна. Това обаче генерира грешка:

Грешка: Аргумент 1 трябва да има имена.

Въпроси

  1. какво се случва тук
  2. Как мога да предотвратя това да се случи ;) ?

person user213544    schedule 13.07.2020    source източник
comment
Може би база: do.call(rbind, a)   -  person zx8754    schedule 13.07.2020
comment
bind_rows() първоначално е dplyr функция и е проектирана да свързва заедно data.frames или tibbles. Тъй като data.frame колоните имат имена, bind_rows очаква входът да бъде наименуван, затова получавате грешка. rbind е по-малко строг тук.   -  person TimTeaFan    schedule 13.07.2020


Отговори (1)


Единият вариант може да бъде:

map_dfr(a, ~ set_names(.x, paste0("V", seq_along(.x))))

     V1    V2    V3    V4
  <dbl> <dbl> <dbl> <dbl>
1     1     2     3     4
2     1     2     3     4
3     4     5     6     3
4     6     3     2     6
person tmfmnk    schedule 13.07.2020
comment
Получавате същата грешка? (Може би проблем с версията: R версия 3.6.2; tidyverse_1.3.0) - person zx8754; 13.07.2020
comment
@zx8754 да, с bind_rows(a) получавам същата грешка като OP. - person tmfmnk; 13.07.2020
comment
Няма нужда да използвате map() на purrr: a %>% set_names(., c("V1", "V2", "V3", "V4")) %>% bind_rows. - person TimTeaFan; 13.07.2020
comment
@TimTeaFan set_names() всъщност е от purrr :) В допълнение, вашето решение се свързва по обратния начин, както желаете. - person tmfmnk; 13.07.2020
comment
@tmfmnk Работи много добре! Само за мое разбиране: какво всъщност прави ~? - person user213544; 13.07.2020
comment
@tmfmnk прав си, без map set_names() наименува елементите на списъка, а не векторите, поради което моят подход транспонира матрицата. set_names() обаче първоначално е от rlang. - person TimTeaFan; 13.07.2020