根据前一组

时间:2018-02-26 13:32:34

标签: r dplyr

使用这些数据:

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_depthstart_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。

1 个答案:

答案 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