В R: Как привести список векторов с неравной длиной к фрейму данных, используя tidyverse? - PullRequest
1 голос
/ 22 марта 2020

Предположим, у вас есть следующий список в R:

list_test <- list(c(2,4,5, 6), c(1,2,3), c(7,8))

Я ищу файл данных следующей формы:

value list_index
  2      1
  4      1
  5      1
  6      1
  1      2
  2      2
  3      2
  7      3
  8      3

Я пытался найти решение с помощью tidyverse, но либо потерял list_index / name, либо возникли проблемы с неравной длиной векторов.

Ответы [ 3 ]

3 голосов
/ 22 марта 2020

Вы можете дать имя списку и затем использовать stack в базе R.

names(list_test) <- seq_along(list_test)
stack(list_test)

#  values ind
#1      2   1
#2      4   1
#3      5   1
#4      6   1
#5      1   2
#6      2   2
#7      3   2
#8      7   3
#9      8   3

Если вы заинтересованы в решении tidyverse, мы можем использовать enframe с unnest .

tibble::enframe(list_test) %>% tidyr::unnest(value)

или imap_dfr из purrr.

purrr::imap_dfr(list_test, ~tibble::tibble(value = .x, list_index = .y))
1 голос
/ 22 марта 2020

Другой вариант может быть:

map_dfr(list_test, ~ enframe(.) %>%
         select(-name), .id = "name")

  name  value
  <chr> <dbl>
1 1         2
2 1         4
3 1         5
4 1         6
5 2         1
6 2         2
7 2         3
8 3         7
9 3         8

Или, если вы не возражаете, иметь столбец также с векторными индексами:

map_dfr(list_test, enframe, .id = "name_list")

  name_list  name value
  <chr>     <int> <dbl>
1 1             1     2
2 1             2     4
3 1             3     5
4 1             4     6
5 2             1     1
6 2             2     2
7 2             3     3
8 3             1     7
9 3             2     8
0 голосов
/ 22 марта 2020

В base R мы можем использовать lengths для репликации последовательности и unlist элементы list в два столбца 'data.frame'

data.frame(value = unlist(list_test), 
     list_index = rep(seq_along(list_test), lengths(list_test)))
#  value list_index
#1     2          1
#2     4          1
#3     5          1
#4     6          1
#5     1          2
#6     2          2
#7     3          2
#8     7          3
#9     8          3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...