R 中 table 中最后一行的积分值

Values of integral as a last row in table in R

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

示例。

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

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

我尝试使用此代码,但没有成功。

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

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

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

这是一个方法。
重写函数以获取一个额外的参数,即 3 维向量 X,对应于 table 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 循环不是很满意table,这里有一个等效的 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
}

输出同上

与@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>