在日期列表中使用map_dfr()

umuewwlo  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(74)

有没有一种方法可以使用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."))

创建于2023-04-18带有reprex v2.0.2

pcrecxhr

pcrecxhr1#

你想要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

创建于2023-04-18带有reprex v2.0.2.9000

eivgtgni

eivgtgni2#

请注意,map_df的每个结果元素都应该是一个 Dataframe 。然后它可以将这些 Dataframe 组合成一个 Dataframe 。下面是一个解决方案。只是为了指出,请注意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

相关问题