Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R表中最后一行的积分值_R_Dataframe_Dplyr_Integral - Fatal编程技术网

R表中最后一行的积分值

R表中最后一行的积分值,r,dataframe,dplyr,integral,R,Dataframe,Dplyr,Integral,可以从R中的数据帧计算积分吗 例如 t <- data.frame(x1 = c(200), x2 = c(2), x3 = c(1:500)) t带dplyr: library(dplyr) Func <- function(z,t) {t*z} t %>% rowwise %>% mutate(new = integrate(function(z) Func(z,x1+x2+x3), lower =

可以从R中的数据帧计算积分吗

例如

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

t带
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
库(dplyr)
Func%rowwise%>%
变异(新=积分(函数(z)Func(z,x1+x2+x3),下=1,上=2)$value)
#一个tibble:500x4
#顺时针:
x1x2x3新
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 
# ... 还有490行
这里有一个方法。
重写函数以获取一个额外的参数,即3维向量
X
,对应于表的每一行
t
。然后在
t
行上的
apply
循环中计算积分

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

输出与上面相同。

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

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

as.list.integrate%
行()
变异(new=list(as.list(integrate(函数(z){(x1+x2+x3)*z},1,2)))%>%
unnest_加宽(新,简化=真)
#一个tibble:500x8
x1x2x3值abs.error细分消息调用
1   200     2     1  305.  3.38e-12 1正常
2   200     2     2  306.  3.40e-12 1正常
3   200     2     3  308.  3.41e-12 1正常
420024309343E-121OK
5   200     2     5  310.  3.45e-12 1正常
6200263123.46e-12 1正常
7   200     2     7  314.  3.48e-12 1正常
820028315 3.50e-12 1正常
9   200     2     9  316.  3.51e-12 1正常
10200210318 3.53e-12 1正常

阅读此函数的文档
integrate()
,这就是我发现的:函数必须是一个R函数,它接受一个数字的第一个参数并返回一个相同长度的数字向量。
你的函数接受一个数字并返回一个500个元素的向量。你的函数应该如何工作?你忘了重写函数
Func
,现在它需要两个参数,虽然相等,但公式不同。@Rui,谢谢,更正了!
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
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
}
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>