Создание фрейма данных из списка таблиц с разными именами столбцов - PullRequest
1 голос
/ 14 апреля 2019

У меня есть длинный список таблиц, которые мне нужно превратить в фрейм данных. Проблема в том, что разные таблицы имеют разные имена столбцов. Все имена варьируются от 1 до 5, но, например, в некоторых таблицах есть только столбец 2, в других столбцы 4 и 5, а в других - пять столбцов.

Пример данных:

> head(bffrsTbls)
[[1]]

   2    5 
 711 1781 

[[2]]

   2    5 
1168 1530 

[[3]]

   1    2    3    5 
 390  471  904 1237 

Я уже пробовал bffrsTbls %>% purrr::map_df(., dplyr::bind_rows), но значения в результирующем фрейме данных не соответствуют именам столбцов каждой таблицы.

Результат, который я ищу, - это фрейм данных, такой как этот, со столбцами val1 до val5, соответствующими столбцам 1-5 каждой таблицы, и дополнительным столбцом, показывающим номер элемента списка, в котором находятся данные этого конкретного столбец пришел от:

ListElmnt   val1   val2   val3   val4   val5
1           NA     711    NA     NA     1781
2           NA     1168   NA     NA     1530
3           390    471    904    NA     1237

1 Ответ

1 голос
/ 14 апреля 2019

Мы можем преобразовать элементы list в tibble, пройдя по list с помощью map и изменив его на один data.frame

library(tidyverse)
map_dfr(bffrsTbls, ~ .x %>%
                     as.list %>%
                     as_tibble)

Если нам также понадобятся все комбинации, enframe элементы list для таблицы с двумя столбцами и spread выходного набора данных в расширенном формате

bffrsTbls %>%
  map_df(enframe, .id = 'ListElmnt') %>% 
  mutate(name = factor(paste0('val', name), levels = paste0("val", 1:5))) %>% 
  spread(name, value, drop = FALSE)
# A tibble: 3 x 6
#  ListElmnt  val1  val2  val3  val4  val5
#  <chr>     <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1            NA   711    NA    NA  1781
#2 2            NA  1168    NA    NA  1530
#3 3           390   471   904    NA  1237

Или используя base R

xtabs(values ~ ListElmnt + ind, do.call(rbind, Map(cbind, 
      lapply(bffrsTbls, stack), ListElmnt = seq_along(bffrsTbls))))

данные

bffrsTbls <- list(structure(c(`2` = 711, `5` = 1781), .Dim = 2L, .Dimnames = list(
c("2", "5")), class = "table"), structure(c(`2` = 1168, `5` = 1530
 ), .Dim = 2L, .Dimnames = list(c("2", "5")), class = "table"), 
   structure(c(`1` = 390, `2` = 471, `3` = 904, `5` = 1237), .Dim = 4L,
   .Dimnames = list(
    c("1", "2", "3", "5")), class = "table"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...