使用这些数据:
library(tidyverse)
df <-
structure(
list(
start_depth = c(10, 15, 20, 25, 30),
end_depth = c(15,
20, 25, 30, 35),
k = c(
0.136,
0.135,
0.133,
0.139,
0.132
)
),
row.names = c(NA,-5L),
class = c("tbl_df", "tbl", "data.frame"),
.Names = c("start_depth",
"end_depth", "k")
)
df
#> # A tibble: 5 x 3
#> start_depth end_depth k
#> <dbl> <dbl> <dbl>
#> 1 10.0 15.0 0.136
#> 2 15.0 20.0 0.135
#> 3 20.0 25.0 0.133
#> 4 25.0 30.0 0.139
#> 5 30.0 35.0 0.132
我想使用以下公式来传播每对end_depth
和start_depth
的值,增量为1米。
例如,我们假设我从start_val = 0.001
开始为30-35米课程:
end_depth = 35
0.001000000 = 0.001000000 * exp(0.132 *(35 - (35)))
end_depth = 34
0.001141108 = 0.001000000 * exp(0.132 *(35 - (34)))
end_depth = 33
0.001302128 = 0.001000000 * exp(0.132 *(35 - (33)))
end_depth = 32
0.001485869 = 0.001000000 * exp(0.132 *(35 - (32)))
end_depth = 31
0.001695538 = 0.001000000 * exp(0.132 *(35 - (31)))
end_depth = 30
0.001934792 = 0.001000000 * exp(0.132 *(35 - (30)))
然后,25-30米的班级,我会重新开始,但使用最后的计算值(即0.001934792)
end_depth = 30
0.001934792 * exp(0.139 *(30 - (30)))
end_depth = 29
0.001934792 * exp(0.139 *(30 - (29)))
我正在使用dplyr,但任何其他选项都有效(例如:base R. data.table等)
由reprex package(v0.2.0)创建于2018-02-26。
答案 0 :(得分:2)
使用for
循环
# First adding a vector with starting values
df1 <- df
df1$start_val <- c(rep(NA, 4),0.001)
# the loop
res <- list()
for (i in nrow(df1):1){
# for which values to calculated by increment 1
index <- df1$end_depth[i]:df1$start_depth[i]
tmp <- sapply(index, function(x){
df1$start_val[i] * exp(df$k[i] * (max(index) - (x)))
})
df_tmp <- cbind(index, tmp)
df1$start_val[i-1] <- df_tmp[nrow(df_tmp),2]
res[[i]] <- df_tmp
}
df1
# A tibble: 5 x 4
start_depth end_depth k start_val
<dbl> <dbl> <dbl> <dbl>
1 10 15 0.136 0.014805519
2 15 20 0.135 0.007538325
3 20 25 0.133 0.003876761
4 25 30 0.139 0.001934792
5 30 35 0.132 0.001000000
lapply(res, tail, 2)
[[1]]
index tmp
[5,] 11 0.02550820
[6,] 10 0.02922428
[[2]]
index tmp
[5,] 16 0.01293582
[6,] 15 0.01480552
[[3]]
index tmp
[5,] 21 0.006599540
[6,] 20 0.007538325
[[4]]
index tmp
[5,] 26 0.003373666
[6,] 25 0.003876761
[[5]]
index tmp
[5,] 31 0.001695538
[6,] 30 0.001934792