Использование map_dfr() со списком дат

Есть ли способ использовать purrr::map_dfr() для запуска функции в списке дат разной длины/отсутствия?

Пока что я могу сделать это с помощью map, затем enframe, затем unnest:

library(tidyverse)

date_list <- list(as.Date('2020-01-01'),
     c(as.Date('2021-01-01'), as.Date('2021-06-01')),
     NA_Date_,
     c(as.Date('2022-01-01'), as.Date('2022-08-01')),
     as.Date('2023-01-01')) 

map(date_list, max) |> 
  enframe(value = "latest") |> 
  unnest(cols = "latest") |>
  select(latest)
#> # A tibble: 5 × 1
#>   latest    
#>   <date>    
#> 1 2020-01-01
#> 2 2021-06-01
#> 3 NA        
#> 4 2022-08-01
#> 5 2023-01-01

Однако использование более краткого map_dfr возвращает следующую ошибку:

map_dfr(date_list, max, .id = "latest")
#> Error in `dplyr::bind_rows()`:
#> ! Argument 1 must be a data frame or a named atomic vector.
#> Backtrace:
#>     ▆
#>  1. └─purrr::map_dfr(date_list, max, .id = "latest")
#>  2.   └─dplyr::bind_rows(res, .id = .id)
#>  3.     └─rlang::abort(glue("Argument {i} must be a data frame or a named atomic vector."))

Created on 2023-04-18 with reprex v2.0.2

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Обратите внимание, что каждый результирующий элемент map_df должен быть кадром данных. Затем он может объединить эти кадры данных в фрейм данных. Ниже приведено решение. Просто отметим, что map_dfmap_dfrmap_dfc и их эквивалентные 2 входа, т.е. map2_df и т. д., были заменены. Прочтите справочную страницу по этим функциям.

map_df(date_list, ~tibble(latest = max(.x)))

# A tibble: 5 × 1
  latest    
  <date>    
1 2020-01-01
2 2021-06-01
3 NA        
4 2022-08-01
5 2023-01-01

Спасибо, хотя это полезно, я не верю, что map_df требует, чтобы входные данные были фреймами данных — они также могут быть списками или атомарными векторами. Решение, которое вы предоставили здесь, работает, но оно неэффективно в вычислительном отношении. Я заметил, что map_dfr был заменен на map и list_rbind(), поэтому мне нужно будет изучить это.

Hersh Gupta 18.04.2023 18:46
Ответ принят как подходящий

Хочешь purrr::map_vec()?

library(purrr)

date_list <- list(
  as.Date('2020-01-01'),
  c(as.Date('2021-01-01'), as.Date('2021-06-01')),
  lubridate::NA_Date_,
  c(as.Date('2022-01-01'), as.Date('2022-08-01')),
  as.Date('2023-01-01')
) 

map_vec(date_list, max)
#> [1] "2020-01-01" "2021-06-01" NA           "2022-08-01" "2023-01-01"

tibble::tibble(latest = map_vec(date_list, max))
#> # A tibble: 5 × 1
#>   latest    
#>   <date>    
#> 1 2020-01-01
#> 2 2021-06-01
#> 3 NA        
#> 4 2022-08-01
#> 5 2023-01-01

Created on 2023-04-18 with reprex v2.0.2.9000

Спасибо! Это более эффективно, чем подход map, enframe, unnest, который я использовал.

Hersh Gupta 18.04.2023 23:36

Другие вопросы по теме