#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