我的数据框如下
lower <- c(1,5,15)
upper <-c(5,15,30)
df<-data.frame(lower,upper)
我想使用dplyr的mutate在已定义函数的曲线下创建面积的新变量。功能如下。
my_fun <- function(x){y = 1.205016 + 0.03796243 * log(x)}
我正在使用integral()
包中的pracma
函数来查找曲线下的面积。当我在上下两个值上使用此函数时,它不会出现错误,如下所示。
integral(my_fun, 1,5)
[1] 4.973705`
但是,当我尝试使用dplyr的mutate运行此功能时,会得到以下信息。
new_df <- df %>%
mutate(new_variable = integral(my_fun, lower, upper))
积分错误(my_fun,lower,upper):length(xmin)== 1不是 是
似乎integral
函数必须读取整个向量df$lower
和df$upper
,而不是单个值对1,5
。使用dplyr的mutate
是否可以解决此问题,还是应该寻找其他解决方案?
我四处张望,这个与mutate相关的错误的唯一实例似乎并未解决我在这里遇到的问题。
答案 0 :(得分:2)
我们可以使用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