ошибка dplyr «длина (xmin) == 1 не соответствует ДЕЙСТВИТЕЛЬНОСТИ» с изменением при использовании функции integral()

#r #dplyr

#r #dplyr

Вопрос:

У меня есть фрейм данных со следующим

 lower <- c(1,5,15)
upper <-c(5,15,30)
df<-data.frame(lower,upper)
  

Я хотел бы использовать mutate dplyr для создания новой переменной области под кривой определенной функции. Функция выглядит следующим образом.

 my_fun <- function(x){y = 1.205016   0.03796243 * log(x)}
  

Я использую integral() функцию из pracma пакета, чтобы найти область под кривой. Когда я использую эту функцию для пары верхних и нижних значений, она выполняется без ошибок следующим образом.

 integral(my_fun, 1,5)
[1] 4.973705`
  

Однако, когда я пытаюсь запустить эту же функцию, используя mutate от dplyr, я получаю следующее.

 new_df <- df %>%
   mutate(new_variable = integral(my_fun, lower, upper))
  

Ошибка в integral(my_fun, нижний, верхний): длина (xmin) == 1 не
ВЕРНО

Кажется, что integral функция должна считывать целые векторы df$lower , df$upper а не отдельные пары значений 1,5 . Есть ли решение этой проблемы с использованием dplyr mutate , или я должен искать другие решения.

Я немного осмотрелся, и единственные случаи этой ошибки, связанные с mutate, похоже, не решали проблему, с которой я столкнулся здесь.

Ответ №1:

Мы могли бы использовать rowwise

 library(dplyr)
library(pracma)
df %>%
    rowwise %>%
     mutate(new_variable = integral(my_fun, lower, upper))
  

-вывод

 # A tibble: 3 x 3
# Rowwise: 
#  lower upper new_variable
#  <dbl> <dbl>        <dbl>
#1     1     5         4.97
#2     5    15        12.9 
#3    15    30        19.8 
  

Или с map2

 library(purrr)
df %>%
     mutate(new_variable = map2_dbl(lower, upper, ~integral(my_fun, .x, .y)))   
  

-вывод

 #  lower upper new_variable
#1     1     5     4.973705
#2     5    15    12.907107
#3    15    30    19.837273
  

Или с использованием pmap

 df %>%
     mutate(new_variable = pmap_dbl(cur_data(), ~ integral(my_fun, ..1, ..2)))
#  lower upper new_variable
#1     1     5     4.973705
#2     5    15    12.907107
#3    15    30    19.837273
  

Или с использованием base R

 df$new_variable <-  unlist(Map(function(x, y) 
          integral(my_fun, x, y), df$lower, df$upper))
  

Или при использовании apply из base R

 apply(df, 1, function(x) integral(my_fun, x[1], x[2]))
#[1]  4.973705 12.907107 19.837273
  

Комментарии:

1. спасибо за ваш ответ. Знаете ли вы ресурс, который помог бы мне понять, почему я получил эту ошибку? Я привык использовать mutate() с другими функциями и раньше не видел этой ошибки.

2. @Rhizoblaster Вы имели в виду ошибку в вашей функции или ошибку, основанную на моем коде?

3. @Rhizoblaster если это ошибка, показанная в вашем сообщении, это просто то, что функция не векторизована для аргументов. т. Е. Она может принимать только одно нижнее, верхнее значение, а не несколько значений. Таким образом, она останавливается при проверке длины, когда она больше 1