问题描述
我有数据:
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的递归函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!