У меня есть список следующей структуры:

list(user = "andodet", tag = "", dates = list(`2020-06-12` = "2", 
    `2020-06-03` = "1", `2020-05-27` = "1", `2020-05-24` = "1", 
    `2020-05-06` = "1", `2020-05-01` = "1", `2020-04-08` = "1", 
    `2020-03-19` = "1", `2020-03-02` = "1", `2020-02-26` = "2", 
    `2020-02-22` = "1", `2020-02-14` = "3", `2020-02-13` = "3", 
    `2020-02-12` = "3", `2020-02-11` = "1", `2020-02-10` = "1", 
    `2020-02-04` = "1", `2020-01-27` = "1", `2020-01-21` = "1", 
    `2020-01-18` = "1", `2020-01-11` = "1", `2020-01-10` = "1", 
    `2020-01-09` = "1", `2020-01-07` = "1", `2020-01-04` = "2", 
    `2019-12-20` = "1", `2019-12-17` = "2", `2019-12-16` = "1", 
    `2019-12-15` = "1", `2019-12-14` = "1", `2019-12-11` = "2", 
    `2019-12-10` = "1", `2019-12-05` = "1", `2019-12-02` = "1", 
    `2019-11-29` = "1", `2019-11-18` = "1", `2019-11-06` = "1", 
    `2019-11-03` = "3", `2019-10-30` = "1", `2019-10-28` = "1", 
    `2019-10-27` = "2", `2019-10-24` = "3", `2019-10-22` = "3", 
    `2019-10-21` = "1", `2019-10-17` = "1", `2019-10-13` = "1", 
    `2019-10-09` = "1", `2019-10-08` = "10", `2019-09-26` = "1", 
    `2019-09-24` = "2", `2019-09-19` = "1", `2019-09-14` = "1", 
    `2019-09-10` = "2", `2019-09-06` = "2", `2019-09-04` = "2", 
    `2019-09-03` = "1", `2019-09-02` = "1", `2019-09-01` = "3", 
    `2019-08-31` = "1", `2019-08-30` = "1", `2019-08-29` = "1", 
    `2019-08-28` = "2", `2019-08-27` = "2", `2019-08-26` = "7", 
    `2019-08-24` = "3", `2019-08-23` = "2", `2019-08-21` = "5", 
    `2019-08-20` = "2"))

Мне нужно преобразовать его в фрейм данных с двумя столбцами ( date и count ). Мне удалось это сделать с помощью следующего фрагмента кода:

parsed <- my_list[["dates"]]
data.frame(date = names(parsed),
           count = unlist(parsed), row.names = NULL) %>%
    head()

#         date count
# 1 2020-06-12     2
# 2 2020-06-03     1
# 3 2020-05-27     1
# 4 2020-05-24     1
# 5 2020-05-06     1
# 6 2020-05-01     1

Я не люблю это решение и считаю его довольно коренастым. Я хотел бы понять, есть ли более tidyverse способ сделать это за один раз. purrr, вероятно, лучший вариант, но я все еще пытаюсь привыкнуть к его синтаксису.

r
1
anddt 13 Июн 2020 в 01:42

1 ответ

Лучший ответ

После pluck вставки элемента 'date' из list, enframe, named list в двухколоночный тибл с enframe, { {X6}} столбец 'count' и при необходимости преобразуйте type

library(dplyr)
library(tibble)
library(purrr)
library(tidyr)
library(readr)
my_list %>% 
    pluck('dates') %>% 
    enframe(name = 'date', value = 'count') %>% 
    unnest(c(count)) %>%
    type_convert
# A tibble: 68 x 2
#   date       count
#   <date>      <dbl>
# 1 2020-06-12     2
# 2 2020-06-03     1
# 3 2020-05-27     1
# 4 2020-05-24     1
# 5 2020-05-06     1
# 6 2020-05-01     1
# 7 2020-04-08     1
# 8 2020-03-19     1
# 9 2020-03-02     1
#10 2020-02-26     2
# … with 58 more rows

Или в base R с stack

type.convert(stack(my_list$dates)[2:1], as.is = TRUE)

РЕДАКТИРОВАТЬ: добавлено type_convert из readr на основе комментариев @ alistaire

1
akrun 12 Июн 2020 в 22:51