【问题标题】:create lag column with starting value 0 and lagging from there创建起始值为 0 并从那里滞后的滞后列
【发布时间】:2020-05-14 23:27:12
【问题描述】:

我正在尝试在我的数据中计算一个新列,其中每一行使用前一行的滞后,第一行使用值 0。我试图在 tidyverse 中执行此操作,但可以好像没弄好。

数据如下所示:

library(tidyverse)

sample <- 1:10
var <- c(10, 5, 16, 12, 13, 4, 17, 20, 10, 7)
df <- data.frame(sample, var)

我的新列名为new_var,计算方式为lag(new_var) + sample_i - target - k)。

我尝试过使用accumulate() 函数,但似乎无法正确使用。这是我所在的位置:

target <- 11
k <- 2

df %>% 
  mutate(new_var = accumulate(.y = var, 
                              .f = ~.x + .y - target - k,
                              .x = 0))

预期的输出是:

(-3, 3, 5,-1, 0, -9, 4, 7, -3, 6)

我在 excel 中处理它以显示它的外观:

为了得出这个结论,样本 1 的“实际 new_var”列中的等式如下(使用 0 作为初始等式中的第一个数字):

O2 + K7 - $O$3 - $O$4

并且每个后续样本都滞后于“new_var”列(将 Target 和 K 保持为常数,并使用滞后值作为等式中的第一个数字):

O3 + K8 - $O$3 - $O$4

【问题讨论】:

  • 这篇帖子似乎有用:stackoverflow.com/questions/31905001/…
  • 是的,我刚刚编辑它以显示(-8, -5, -6, -6, -15, -11, -4, -7, -13)的预期输出
  • @user3585829 你能解释一下前几个值的计算吗?你是怎么得到-8, -5, -6的?
  • 我在编辑的答案中更明确地说明了这一点。
  • 是的,抱歉,我意识到我没有很好地解释这一点。第二个值实际上应该是 -11。对于值 1,等式为 0 + 10 - 11 - 2 = -3,对于值 2,则等式为 -3 + 5 - 11 - 2 = -11。对不起。希望这是有道理的。

标签: r tidyverse


【解决方案1】:

您可能正在寻找:

library(dplyr)
library(purrr)

df %>% 
      mutate(new_var = accumulate(.x = var, 
                                  .f = ~.x + .y - target - k, 
                                  .init = 0)[-1])
#   sample var new_var
#1       1  10      -3
#2       2   5     -11
#3       3  16      -8
#4       4  12      -9
#5       5  13      -9
#6       6   4     -18
#7       7  17     -14
#8       8  20      -7
#9       9  10     -10
#10     10   7     -16

在base R中,可以写成:

Reduce(function(x, y) x + y - target - k, df$var, accumulate = TRUE, init = 0)[-1]
#[1]  -3 -11  -8  -9  -9 -18 -14  -7 -10 -16

【讨论】:

  • 感谢您的帮助,但也许我没有以正确的方式解释它。我已经编辑了这个问题,并举例说明了它在 excel 中的外观,因此得到了我期望的结果。不是 0 是列中的第一个值,只是 0 是等式中的第一个值,然后滞后从那里移动。
  • @user3585829 我已经更新了答案,希望这次能给你想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2018-07-04
  • 1970-01-01
相关资源
最近更新 更多