在传递给函数之前过滤 .x ~

filter .x before passing to function ~

我在 purrr 和 dplyr 链中有一个片段:

MAPE180 = map_dbl(TestData, ~Metrics::mape(.x %>% filter(TENURE == 180) %>% pull(CUMULATIVE_AMOUNT), 
                                           .x %>% filter(TENURE == 180) %>% pull(Prediction)))

这很好用。我想删除 .x %>% filter(TENURE == 180) 的重复项并尝试此操作,希望得到等效项:

MAPE180 = map_dbl(TestData %>% filter(TENURE == 180), ~Metrics::mape(.x$CUMULATIVE_AMOUNT, .x$Prediction))

但这会给出错误信息:

Error: Problem with `mutate()` column `MAPE180`.
ℹ `MAPE180 = map_dbl(...)`.
x no applicable method for 'filter' applied to an object of class "list"

如何在传递到波浪线 ~ 之前过滤我的 .x

根据显示的错误,filter 应用于 list,但不起作用。相反,对 list 的每个元素执行一次 filter,而不是两次

library(purrr)
library(dplyr)
map_dbl(TestData, ~ {
          tmp <- .x %>% 
                filter(TENURE == 180) # do filter once
          Metrics::mape(tmp %>% 
                          pull(CUMULATIVE_AMOUNT), 
                                           tmp %>% 
                          pull(Prediction))
    })

此外,这也可以在 summarise

内完成
map_dfr(TestData, ~ .x %>%
                filter(TENURE == 180) %>%
                summarise(MAPE = Metrics::mape(CUMULATIVE_AMOUNT, 
                     Prediction)))