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>
是否可以从 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>