如何在我的代码中提供单个双精度而不是双精度向量

How can I provide a single double and not a double vector in my code

我有一些代码利用 pmap_dbl 来计算一些拆分。我创建了一个未加权版本和一个加权版本。未加权版本按预期运行并产生所需的输出。

加权版本利用我的 getRwt 函数(新近权重)并尝试将计算的权重应用于拆分计算。此版本抛出以下错误:

Error: Problem with `mutate()` input `splt_1a`. x Result 1 must be a single double, not a double vector of length 4 i Input `splt_1a` is `pmap_dbl(...)`.

我相信这个错误是在告诉我,我没有为个人 race_date 提供我的功能,而是提供了一个 race_date 列。不幸的是,我不知道如何提供个人日期。 race_date 函数正在寻找的是当前行的比赛日期。

这是我的标题、函数和代码的代表。

library(tidyverse)
library(lubridate)
#> 
#> Attaching package: 'lubridate'
#> The following objects are masked from 'package:base':
#> 
#>     date, intersect, setdiff, union

df <- tibble(name=c("Bill","Bill","Bill","Bill"), n=c(1,2,3,4), trk=c("GP","GP","SA","GP"), TE=c(2,4,0,1), race_date=c("11/1/2020", "12/31/2020","2/28/2021","4/7/2021"))

df
#> # A tibble: 4 x 5
#>   name      n trk      TE race_date 
#>   <chr> <dbl> <chr> <dbl> <chr>     
#> 1 Bill      1 GP        2 11/1/2020 
#> 2 Bill      2 GP        4 12/31/2020
#> 3 Bill      3 SA        0 2/28/2021 
#> 4 Bill      4 GP        1 4/7/2021

getRwt <- function(a, b){
  interval <- interval(a, b)
  d <- round(time_length(interval, "day"))
  t <- if_else(d < 366,d/7, d/5) /290
  rwt <- exp(1)^-t
  return(rwt)
}

# Unweighted Version

df %>% 
  mutate(splt_1 = pmap_dbl(list(trk, n),  ~ sum(if_else(trk == ..1 & ..2 > n, TE, as.numeric(0))))) 
#> # A tibble: 4 x 6
#>   name      n trk      TE race_date  splt_1
#>   <chr> <dbl> <chr> <dbl> <chr>       <dbl>
#> 1 Bill      1 GP        2 11/1/2020       0
#> 2 Bill      2 GP        4 12/31/2020      2
#> 3 Bill      3 SA        0 2/28/2021       0
#> 4 Bill      4 GP        1 4/7/2021        6

# Recency Weighted Version

df %>% 
  mutate(splt_1a = pmap_dbl(list(trk, n, race_date),  ~ sum(if_else(trk == ..1 & ..2 > n, TE, as.numeric(0))) * getRwt(race_date, ..3)))

#> Error: Problem with `mutate()` input `splt_1a`.
#> x Result 1 must be a single double, not a double vector of length 4
#> i Input `splt_1a` is `pmap_dbl(...)`.

由 reprex 包 (v0.3.0) 创建于 2021-04-14

感谢合作,问题已解决

您必须将 race_date 的列类型更改为 Date:

library(dplyr)
library(tidyr)
library(purrr)
library(lubridate)

df %>% 
  mutate(race_date = mdy(race_date), 
         splt_1a = pmap_dbl(list(trk, n, race_date),  ~ sum(if_else(trk == ..1 & ..2 > n, TE * getRwt(race_date, ..3), as.numeric(0))))) %>%
  unnest_wider(splt_1a) 

# A tibble: 4 x 6
  name      n trk      TE race_date   ...1
  <chr> <dbl> <chr> <dbl> <date>     <dbl>
1 Bill      1 GP        2 2020-11-01  0   
2 Bill      2 GP        4 2020-12-31  1.94
3 Bill      3 SA        0 2021-02-28  0   
4 Bill      4 GP        1 2021-04-07  5.66