使用dplyr的递归函数

时间:2018-02-19 14:15:59

标签: r dplyr

我有数据:

dat <- tibble(
         day = 200:210,
         x = sample(-10:10, size = 11,replace = T))

我有一个变量y,初始值为2.我想通过在给定的时间步骤中将x添加到y来计算y的最终值 以下表示法:

y[i] = y[i-1] + x

如果我这样做了:

y <- 5
dat %>% mutate(y = y + x)

它为每个x添加y。

# A tibble: 11 x 3
    day     x     y
  <int> <int> <dbl>
1   200     4     9
2   201     3     8
3   202    -4     1
4   203    -7    -2
5   204    -3     2
6   205     1     6
7   206    -5     0
8   207    -1     4
9   208    -4     1
10  209    -2     3
11  210     4     9

The answer should be:

  # A tibble: 11 x 3
    day     x     y
  <int> <int> <dbl>
1   200     4     9
2   201     3     12
3   202    -4     8
4   203    -7     1
5   204    -3     -2
6   205     1     -1
7   206    -5     -6
8   207    -1     -7
9   208    -4     -11
10  209    -2     -13
11  210     4     -9

如何使用dplyr包实现此目的?或者任何其他快速而快速的方法。

修改

如果我想施加一个条件使得y不能超过10或者为负。如果它超过10,则使其为10,如果为负,则将其设为零。 我如何实现这一目标:

a tibble:11 x 3

      day     x     y     y1
  1   200     4     9     9
  2   201     3     12    10
  3   202    -4     8     6
  4   203    -7     1     0 
  5   204    -3     -2    0
  6   205     1     -1    0
  7   206    -5     -6    0
  8   207    -1     -7    0  
  9   208    -4     -11   0
  10  209    -2     -13   0
  11  210     4     -9    0

2 个答案:

答案 0 :(得分:4)

我们可以使用accumulate中的purrr。使用accumulate,在使用值5(sum)启动时执行递归.init = 5个'x'元素,并删除accumulate输出的第一个元素({{1 }})

[-1]

library(purrr) library(dplyr) dat %>% mutate(y = accumulate(x, ~ .x + .y, .init = 5)[-1]) # A tibble: 11 x 3 # day x y # <int> <int> <dbl> # 1 200 4 9.00 # 2 201 3 12.0 # 3 202 -4 8.00 # 4 203 -7 1.00 # 5 204 -3 - 2.00 # 6 205 1 - 1.00 # 7 206 -5 - 6.00 # 8 207 -1 - 7.00 # 9 208 -4 -11.0 #10 209 -2 -13.0 #11 210 4 - 9.00 中的类似方法是

base R

答案 1 :(得分:0)

df %>% mutate(y = 5 + cumsum(x))

或者,在您的额外条件下

df %>% mutate(y = (5 + cumsum(x)) %>% pmin(10) %>% pmax(0))