如何在我的代码中提供单个双精度而不是双精度向量
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
我有一些代码利用 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