我有数据:
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
答案 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))