在两个嵌套的列表列上应用数学函数

时间:2019-06-27 09:09:58

标签: r purrr

我对purrr贴图功能有疑问。

我想在小标题中的两个嵌套列表列上应用数学函数。我想将列转换为数值向量以执行我的计算。

但是我一直收到错误消息: mutate_impl(.data,点)中的错误:   评估错误:数学函数的非数字参数。

我尝试使用purrr :: map2应用自定义函数,但会引发错误。请问能达到目的吗?请参见下面。

mape <- function(actual,pred){
  mape <- mean(abs(ifelse(actual==0,
                          ifelse(pred==0,0,abs(1 - pred)*100),((actual - pred)/actual*100))))
  return (mape)
}

mape_score <- mape_lab %>% mutate(mape_score=map2(data[],pred_lab[],mape))

> mape_lab
# A tibble: 30 x 3
   Location     pred_lab   data             
   <fct>        <list>     <list>           
 1 Balsthal     <dbl [12]> <tibble [12 x 1]>
 2 Balsthal     <dbl [12]> <tibble [12 x 1]>
 3 Balsthal     <dbl [12]> <tibble [12 x 1]>
 4 Bettlach     <dbl [12]> <tibble [12 x 1]>
 5 Bettlach     <dbl [12]> <tibble [12 x 1]>
 6 Bettlach     <dbl [12]> <tibble [12 x 1]>
 7 Oberdorf Bio <dbl [12]> <tibble [12 x 1]>
 8 Oberdorf Bio <dbl [12]> <tibble [12 x 1]>
 9 Oberdorf Bio <dbl [12]> <tibble [12 x 1]>
10 Grenchen     <dbl [12]> <tibble [12 x 1]>

预期结果:

> mape_lab
# A tibble: 30 x 3
   Location     pred_lab   data              mape_score
   <fct>        <list>     <list>            <num>
 1 Balsthal     <dbl [12]> <tibble [12 x 1]>  1244
 2 Balsthal     <dbl [12]> <tibble [12 x 1]>  32545
 3 Balsthal     <dbl [12]> <tibble [12 x 1]>  54554
 4 Bettlach     <dbl [12]> <tibble [12 x 1]>  .....
 5 Bettlach     <dbl [12]> <tibble [12 x 1]>
 6 Bettlach     <dbl [12]> <tibble [12 x 1]>
 7 Oberdorf Bio <dbl [12]> <tibble [12 x 1]>
 8 Oberdorf Bio <dbl [12]> <tibble [12 x 1]>
 9 Oberdorf Bio <dbl [12]> <tibble [12 x 1]>
10 Grenchen     <dbl [12]> <tibble [12 x 1]>

1 个答案:

答案 0 :(得分:0)

在提问时,请添加一个reproducible example

就您的问题而言,主要问题是datatibble,而pred_lab是数字向量。您可以flatten data,因为它只有一列,然后应用mape

library(tidyverse)
mape_lab %>% mutate(mape_score = map2_dbl(data %>% flatten, pred_lab, mape))