【问题标题】:Propagating value based on another value calculated in the previous group基于在前一组中计算的另一个值传播值
【发布时间】:2018-02-26 13:32:34
【问题描述】:

使用这些数据:

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 年 2 月 26 日创建。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是for 循环的一个选项

    v <- 0.001000000
    lst <- vector("list", nrow(df))
     for(i in rev(seq_along(lst))) {
          e1 <- v * exp(df$k[i] *(df$end_depth[i] - 
                      seq(df$start_depth[i], df$end_depth[i], by = 1)))
          lst[[i]] <- e1
          v <- e1[1]
    
     }
    

    -输出

    lst
    #[[1]]
    #[1] 0.02922428 0.02550820 0.02226465 0.01943353 0.01696241 0.01480552
    
    #[[2]]
    #[1] 0.014805519 0.012935817 0.011302229 0.009874938 0.008627890 0.007538325
    
    #[[3]]
    #[1] 0.007538325 0.006599540 0.005777667 0.005058146 0.004428230 0.003876761
    
    #[[4]]
    #[1] 0.003876761 0.003373666 0.002935859 0.002554867 0.002223316 0.001934792
    
    #[[5]]
    #[1] 0.001934792 0.001695538 0.001485869 0.001302128 0.001141108 0.001000000
    

    如果我们使用tidyverse,那么pmapaccumulate_right可以使用

    library(purrr)
    pmap(df, ~ exp(..3 *(..2 - seq(..1, ..2, by = 1))))  %>%
           accumulate_right(~ .x[1] * .y, .init = 0.001000000) %>% 
           head(., -1)
    #[[1]]
    #[1] 0.02922428 0.02550820 0.02226465 0.01943353 0.01696241 0.01480552
    
    #[[2]]
    #[1] 0.014805519 0.012935817 0.011302229 0.009874938 0.008627890 0.007538325
    
    #[[3]]
    #[1] 0.007538325 0.006599540 0.005777667 0.005058146 0.004428230 0.003876761
    
    #[[4]]
    #[1] 0.003876761 0.003373666 0.002935859 0.002554867 0.002223316 0.001934792
    
    #[[5]]
    #[1] 0.001934792 0.001695538 0.001485869 0.001302128 0.001141108 0.001000000
    

    【讨论】:

    • 按预期工作。谢谢。
    • @PhilippeMassicotte 谢谢,我用accumulate添加了一个选项
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 2022-11-28
      • 1970-01-01
      • 2010-12-23
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多