【问题标题】:Values of integral as a last row in table in RR中表中最后一行的积分值
【发布时间】:2021-04-14 16:04:33
【问题描述】:

是否可以从 R 中的数据框计算积分?

示例。

t <- data.frame(x1 = c(200),
           x2 = c(2),
           x3 = c(1:500))

如果 t 是表,是否可以像其他操作一样生成具有积分结果的新列?

我尝试使用此代码,但它不起作用。

Func <- function(z) {(t$x1+t$x2+t$x3)*z}

t$new <- integrate(Func, lower = 1, upper = 2)

【问题讨论】:

  • 阅读这个函数integrate()的文档,这是我发现的:函数必须是an R function taking a numeric first argument and returning a numeric vector of the same length.你的函数接受一个数字并返回一个500元素长的向量。
  • 你的函数应该如何工作?

标签: r dataframe dplyr integral


【解决方案1】:

dplyr

library(dplyr)

Func <- function(z,t) {t*z}

t %>%  rowwise %>% 
       mutate(new = integrate(function(z) Func(z,x1+x2+x3), lower = 1, upper = 2)$value )

# A tibble: 500 x 4
# Rowwise: 
      x1    x2    x3   new
   <dbl> <dbl> <int> <dbl>
 1   200     2     1  305.
 2   200     2     2  306.
 3   200     2     3  308.
 4   200     2     4  309 
 5   200     2     5  310.
 6   200     2     6  312 
 7   200     2     7  314.
 8   200     2     8  315 
 9   200     2     9  316.
10   200     2    10  318 
# ... with 490 more rows

【讨论】:

  • 你忘了重写函数Func,它现在需要2个参数,虽然等效但公式不同。
【解决方案2】:

这是一种方法。
重写函数以获取一个额外的参数,即 3 维向量 X,对应于表 t 的每一行。然后在apply 循环中计算t 行上的积分。

Func <- function(z, X) {
  x1 <- X[[1]]
  x2 <- X[[2]]
  x3 <- X[[3]]
  (x1 + x2 + x3)*z
}

t$new <- apply(t, 1, function(x){
  integrate(Func, lower = 1, upper = 2, X = x)$value
})

head(t)
#   x1 x2 x3   new
#1 200  2  1 304.5
#2 200  2  2 306.0
#3 200  2  3 307.5
#4 200  2  4 309.0
#5 200  2  5 310.5
#6 200  2  6 312.0

如果您对*apply 循环不太满意,这里有一个等效的for 循环。

t$new <- NA
for(i in seq_len(nrow(t))){
  t$new[i] <- integrate(Func, lower = 1, upper = 2, X = t[i, 1:3, drop = TRUE])$value
}

输出同上。

【讨论】:

    【解决方案3】:

    与@Waldi 的方法类似,但从对integrate 的调用中恢复所有信息...

    首先,定义一个将integrate 对象转换为列表的函数(因为没有内置版本)。

    as.list.integrate <- function(x) {
      list(
        value=x$value,
        abs.error=x$abs.error,
        subdivisions=x$subdivisions,
        message=x$message,
        call=x$call
      )
    }
    

    现在进行集成。

    t %>% 
      rowwise() %>% 
      mutate(new=list(as.list(integrate(function(z) {(x1+x2+x3)*z}, 1, 2)))) %>% 
      unnest_wider(new, simplify=TRUE)
    # A tibble: 500 x 8
          x1    x2    x3 value abs.error subdivisions message call      
       <dbl> <dbl> <int> <dbl>     <dbl>        <int> <chr>   <list>    
     1   200     2     1  305.  3.38e-12            1 OK      <language>
     2   200     2     2  306.  3.40e-12            1 OK      <language>
     3   200     2     3  308.  3.41e-12            1 OK      <language>
     4   200     2     4  309   3.43e-12            1 OK      <language>
     5   200     2     5  310.  3.45e-12            1 OK      <language>
     6   200     2     6  312   3.46e-12            1 OK      <language>
     7   200     2     7  314.  3.48e-12            1 OK      <language>
     8   200     2     8  315   3.50e-12            1 OK      <language>
     9   200     2     9  316.  3.51e-12            1 OK      <language>
    10   200     2    10  318   3.53e-12            1 OK      <language>
    

    【讨论】:

      猜你喜欢
      • 2016-08-11
      • 1970-01-01
      • 2018-01-17
      • 2021-11-09
      • 1970-01-01
      • 2017-03-16
      • 2020-05-04
      • 2013-12-12
      • 2017-11-17
      相关资源
      最近更新 更多