dplyr错误“ length(xmin)== 1不是TRUE”,使用积分()函数时

时间:2020-10-14 01:02:22

标签: r dplyr

我的数据框如下

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$lowerdf$upper,而不是单个值对1,5。使用dplyr的mutate是否可以解决此问题,还是应该寻找其他解决方案?

我四处张望,这个与mutate相关的错误的唯一实例似乎并未解决我在这里遇到的问题。

1 个答案:

答案 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