Применить математическую функцию к двум вложенным спискам-столбцам - PullRequest
0 голосов
/ 27 июня 2019

У меня есть вопрос, касающийся функции карты мурлыканья.

Я хотел бы применить математическую функцию к двум вложенным столбцам списка в таблице.Я хотел бы преобразовать столбец в числовой вектор для выполнения моих расчетов.

Но я продолжаю получать сообщение об ошибке: Ошибка в mutate_impl (.data, dots): Ошибка оценки: нечисловой аргумент математической функции.

Я попытался применить пользовательскую функцию, используя 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 голосов
/ 27 июня 2019

При задании вопроса добавьте воспроизводимый пример .

Что касается вашего вопроса, главная проблема в том, что data это tibble, а pred_lab это числовой вектор.Вы можете flatten data, поскольку он имеет только один столбец, а затем применить mape.

library(tidyverse)
mape_lab %>% mutate(mape_score = map2_dbl(data %>% flatten, pred_lab, mape))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...