Есть ли способ использовать 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
Обратите внимание, что каждый результирующий элемент map_df
должен быть кадром данных. Затем он может объединить эти кадры данных в фрейм данных. Ниже приведено решение. Просто отметим, что map_df
map_dfr
map_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
Хочешь 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, который я использовал.
Спасибо, хотя это полезно, я не верю, что
map_df
требует, чтобы входные данные были фреймами данных — они также могут быть списками или атомарными векторами. Решение, которое вы предоставили здесь, работает, но оно неэффективно в вычислительном отношении. Я заметил, чтоmap_dfr
был заменен наmap
иlist_rbind()
, поэтому мне нужно будет изучить это.