本文介绍了使用dplyr的递归函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有数据:

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

我有一个变量 y 的初始值为2。我想通过将x加到y中的y来计算 y 的最终值在
之后的给定时间步长,以下符号:

I have a variable y with initial value of 2. I want to calculate the final value of y by adding x to y in a given time step followingthe following notation:

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软件包实现此目标?或任何其他快速方法。

How do I achive this using dplyr package? Or any other method that is quick and fast.

编辑

如果我要施加一个条件,使得y不能超过10或为负数。如果超过10,则使其为10;如果为负,则使其为零。
如何实现:

If I want to impose a condition such that y cannot exceed 10 or be negative .If it exceeds 10, make it 10 and if it is negative, make it zero.How do I achieve this:

小标题:11 x 3

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


推荐答案

我们可以使用 purrr 中的 accumulate 。用 accumulate 进行'x'元素的递归 sum ,同时以5( .init = 5 )并删除 accumulate 输出的第一个元素( [-1]

We could use accumulate from purrr. With accumulate, do the recursive sum of 'x' elements while initiating with a value of 5 (.init = 5) and remove the first element of accumulate output ([-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






基础R 中类似的方法是

dat$y <- Reduce(function(u, v)  u + v , dat$x, init = 5, accumulate = TRUE)[-1]
dat$y
#[1]   9  12   8   1  -2  -1  -6  -7 -11 -13  -9

这篇关于使用dplyr的递归函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-20 10:59