使用上面data.frame中的行和另一列计算值

Sar*_*rah 5 r dplyr

嗨,我想在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)

www*_*www 5

这是accumulatepurrr包装中使用的解决方案。该accumulate函数可以将具有两个参数的函数(例如xy)应用于向量序列。返回值将成为下一轮的输入值。

在下面的示例中,我要求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)

  • @www-当然,答案的基本R版本(实际上只是一堆隐藏的循环)是`Reduce(function(x,y)(x + y)* 0.99,df $ In,accumulate = TRUE )` (2认同)