R表中最后一行的积分值
可以从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 =
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>