gpt4 book ai didi

r - 在同一个变异函数 dplyr 中使用滞后结果

转载 作者:行者123 更新时间:2023-12-04 11:26:02 27 4
gpt4 key购买 nike

我想使用 dplyr 复制以下公式 R + 滞后功能。代码工作到每组的第二行,然后继续给我 0
预测 = 滞后(值(value),1)*(1-滞后(损耗)/52)
状况:

  • 预测的第一个值应该是空的,因为我们已经有了值。
  • 第二行根据 Attrition 和 Value 列的先前值进行计算。
  • 第三行之前的值应分别从预测(不是值列)和损耗列中选取。

  • 我从第 3 行开始得到 0。下面是我的复制代码。
    data <- data %>% group_by(Patch) %>% mutate(id = row_number())
    data <- data %>% group_by(Patch) %>% mutate(forecast = lag(Value,1)*(1-lag(Attrition,1)/52))

    tbl_df(data)
    # A tibble: 12 x 6
    Patch Week Value Attrition id forecast
    <chr> <date> <dbl> <dbl> <int> <dbl>
    1 11P11 2021-06-14 2 0.075 1 NA
    2 11P11 2021-06-21 0 0.075 2 2.00
    3 11P11 2021-06-28 0 0.075 3 0
    4 11P12 2021-06-14 3 0.075 1 NA
    5 11P12 2021-06-21 0 0.075 2 3.00
    6 11P12 2021-06-28 0 0.075 3 0
    7 11P12 2021-07-05 0 0.075 4 0
    8 11P13 2021-06-14 1 0.075 1 NA
    9 11P13 2021-06-21 0 0.075 2 0.999
    10 11P13 2021-06-28 0 0.075 3 0
    11 11P13 2021-07-05 0 0.075 4 0
    12 11P13 2021-07-12 0 0.075 5 0


    > dput(data)
    structure(list(Patch = c("11P11", "11P11", "11P11", "11P12",
    "11P12", "11P12", "11P12", "11P13", "11P13", "11P13", "11P13",
    "11P13"), Week = structure(c(18792, 18799, 18806, 18792, 18799,
    18806, 18813, 18792, 18799, 18806, 18813, 18820), class = "Date"),
    Value = c(2, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0), Attrition = c(0.075,
    0.075, 0.075, 0.075, 0.075, 0.075, 0.075, 0.075, 0.075, 0.075,
    0.075, 0.075), id = c(1L, 2L, 3L, 1L, 2L, 3L, 4L, 1L, 2L,
    3L, 4L, 5L), forecast = c(NA, 1.99711538461538, 0, NA, 2.99567307692308,
    0, 0, NA, 0.998557692307692, 0, 0, 0)), row.names = c(NA,
    -12L), groups = structure(list(Patch = c("11P11", "11P12", "11P13"
    ), .rows = structure(list(1:3, 4:7, 8:12), ptype = integer(0), class = c("vctrs_list_of",
    "vctrs_vctr", "list"))), row.names = c(NA, -3L), class = c("tbl_df",
    "tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
    "tbl_df", "tbl", "data.frame"))

    最佳答案

    更新解决方案
    这是一个使用 base::Reduce 的简单解决方案:

    do.call(rbind, lapply(split(df, df$Patch), function(x) {
    x$forecast <- c(NA, Reduce(function(a, b) {
    a * (1 - (x$Attrition[b]/52))
    }, 2:(nrow(x)-1), init = x$Value[1], accumulate = TRUE))
    x
    }))

    Patch Week Value Attrition id forecast
    1 11P11 2021-06-14 2 0.075 1 NA
    2 11P11 2021-06-21 0 0.075 2 2.0000000
    3 11P11 2021-06-28 0 0.075 3 1.9971154
    4 11P12 2021-06-14 3 0.075 1 NA
    5 11P12 2021-06-21 0 0.075 2 3.0000000
    6 11P12 2021-06-28 0 0.075 3 2.9956731
    7 11P12 2021-07-05 0 0.075 4 2.9913524
    8 11P13 2021-06-14 1 0.075 1 NA
    9 11P13 2021-06-21 0 0.075 2 1.0000000
    10 11P13 2021-06-28 0 0.075 3 0.9985577
    11 11P13 2021-07-05 0 0.075 4 0.9971175
    12 11P13 2021-07-12 0 0.075 5 0.9956793
    较早的方法
    您也可以使用以下方法。为此,我首先在您的数据集上应用了带有 mutate 的公式,以获得我的 forecast 的第一个值。系列。然后我对包含 NA 的每个组的第一行进行切片。 forecast 的值出去。之后我用了 accumulate函数使用第一个 forecast 计算您想要的系列value 作为 .init 的值争论。然后我将结果数据集与包含 NA 的数据集绑定(bind)在一起。值(value)观:
    library(dplyr)
    library(purrr)

    df %>%
    group_by(Patch) %>%
    mutate(forecast = lag(Value)*(1-(lag(Attrition)/52))) %>%
    filter(between(row_number(), 2, n())) %>%
    mutate(forecast = accumulate(Attrition[-1], .init = forecast[1], ~ ..1 * (1-(..2/52)))) %>%
    bind_rows(df %>% group_by(Patch) %>%
    mutate(forecast = lag(Value)*(1-(lag(Attrition)/52))) %>%
    slice_head()) %>%
    ungroup() %>%
    arrange(Patch, Week)

    # A tibble: 12 x 6
    Patch Week Value Attrition id forecast
    <chr> <date> <dbl> <dbl> <int> <dbl>
    1 11P11 2021-06-14 2 0.075 1 NA
    2 11P11 2021-06-21 0 0.075 2 2.00
    3 11P11 2021-06-28 0 0.075 3 1.99
    4 11P12 2021-06-14 3 0.075 1 NA
    5 11P12 2021-06-21 0 0.075 2 3.00
    6 11P12 2021-06-28 0 0.075 3 2.99
    7 11P12 2021-07-05 0 0.075 4 2.99
    8 11P13 2021-06-14 1 0.075 1 NA
    9 11P13 2021-06-21 0 0.075 2 0.999
    10 11P13 2021-06-28 0 0.075 3 0.997
    11 11P13 2021-07-05 0 0.075 4 0.996
    12 11P13 2021-07-12 0 0.075 5 0.994

    关于r - 在同一个变异函数 dplyr 中使用滞后结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68016611/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com