r语言 - Map返回列表而不是日期



我有一个包含日期的点阵列,我想将它们与日期列表中最近的较高日期相匹配。因此,我写了一个函数matchDate,我想用map来调用它:

library(tidyverse)
d1 = as.Date("2022-01-01")
d2 = as.Date("2022-12-31")
matchDate = function(date,matchDates,...){
matchDates[matchDates >= date] %>% min %>% return
}
df = tibble(date = seq.Date(from=d1,to=d2,by='months'))
dates = seq.Date(from=d2,to=d1,by='-3 months')
df$match = map(df$date,~matchDate(.x,matchDates=dates))
typeof(matchDate(d1,dates))
#> [1] "double"
df
#> # A tibble: 12 x 2
#>    date       match     
#>    <date>     <list>    
#>  1 2022-01-01 <date [1]>
#>  2 2022-02-01 <date [1]>
#>  3 2022-03-01 <date [1]>
#>  4 2022-04-01 <date [1]>
#>  5 2022-05-01 <date [1]>
#>  6 2022-06-01 <date [1]>
#>  ...

在2022-05-30由reprex包(v2.0.1)创建

不确定为什么typeof在这里返回double,但该函数工作正常,map也返回正确的日期。唯一的问题是,它将它们包装成一个列表(长度为1)。我试图在不同的地方添加unlist在我的代码,但它没有改变任何东西。有人能解释一下发生了什么,或者如何正确地取消上市吗?很多谢谢!

我们可以将其扁平化-默认map返回list,如果我们不指定列类型的后缀,即_int,_dbl_chr等返回vectorDate类有点复杂,因为存储模式是整型/双精度,这可以强制其整型存储值

library(purrr)
library(dplyr)
df$match <- map(df$date,~matchDate(.x,matchDates=dates)) %>% 
invoke(c,.)

与产出

> df
# A tibble: 12 × 2
date       match     
<date>     <date>    
1 2022-01-01 2022-03-31
2 2022-02-01 2022-03-31
3 2022-03-01 2022-03-31
4 2022-04-01 2022-07-01
5 2022-05-01 2022-07-01
6 2022-06-01 2022-07-01
7 2022-07-01 2022-07-01
8 2022-08-01 2022-10-01
9 2022-09-01 2022-10-01
10 2022-10-01 2022-10-01
11 2022-11-01 2022-12-31
12 2022-12-01 2022-12-31

对于base R,我们可以使用do.callc

do.call("c", map(df$date,~matchDate(.x,matchDates=dates)))
[1] "2022-03-31" "2022-03-31" "2022-03-31" "2022-07-01" "2022-07-01" "2022-07-01" "2022-07-01" "2022-10-01" "2022-10-01" "2022-10-01"
[11] "2022-12-31" "2022-12-31"

最新更新