嗨,我想在R中做些看起来应该很简单的事情,但是我似乎在脑力衰退。
对于data.frame中的每一行,我想获取Vol上面in行中的值,In为该行添加value,然后减去一个依赖于该值的值。
这是我的尝试,但是滞后只是在开始时向后看一排值,一旦计算出下一个值,就不会继续往后看
library(dplyr)
df <- data.frame(In = c(1,4,0,0,1,2,3,0,0), Vol = c(1,rep(NA,8)))
df %>% mutate(Vol = (lag(Vol) + In) - (lag(Vol) + In)*0.01)
Run Code Online (Sandbox Code Playgroud)
期望的输出=
In Vol
1 1 1.00
2 4 4.95
3 0 4.90
4 0 4.85
5 1 5.79
6 2 7.72
7 3 10.61
8 0 10.50
9 0 10.40
Run Code Online (Sandbox Code Playgroud)
这是accumulate从purrr包装中使用的解决方案。该accumulate函数可以将具有两个参数的函数(例如x和y)应用于向量序列。返回值将成为下一轮的输入值。
在下面的示例中,我要求accumulate函数从In列的第二个数字开始到结尾。我还提供1了.init参数,它将是x函数的第一个参数。
library(dplyr)
library(purrr)
df <- data.frame(In = c(1,4,0,0,1,2,3,0,0), Vol = c(1,rep(NA,8)))
df %>%
mutate(Vol = accumulate(In[2:n()], function(x, y) (x + y) * 0.99, .init = 1))
# In Vol
# 1 1 1.000000
# 2 4 4.950000
# 3 0 4.900500
# 4 0 4.851495
# 5 1 5.792980
# 6 2 7.715050
# 7 3 10.607900
# 8 0 10.501821
# 9 0 10.396803
Run Code Online (Sandbox Code Playgroud)
此外,该Vol列的第一个值似乎与该列的第一个值相同In。如果您要尝试accumulate的只是在In列上执行此过程,则以下代码将更加简洁,甚至无需将第一个值复制到Vol列上。
df %>%
mutate(Vol = accumulate(In, function(x, y) (x + y) * 0.99))
# In Vol
# 1 1 1.000000
# 2 4 4.950000
# 3 0 4.900500
# 4 0 4.851495
# 5 1 5.792980
# 6 2 7.715050
# 7 3 10.607900
# 8 0 10.501821
# 9 0 10.396803
Run Code Online (Sandbox Code Playgroud)