使用计算结果跨几行

时间:2019-11-08 15:23:48

标签: r dplyr

我正在尝试创建一个新变量Rd,如果变量lag(Rd)等于0,它将采用值Vol。否则它将采用值{{1} }。此计算由OI/CumVol完成,因此在第一次观察的情况下,变量Group等于0,我设置了Vol。 这是我想要的示例:

Rd=0

我试图用滞后突变两次,但是问题是如果 Group Vol OI CumVol Rd <date> <dbl> <dbl> <dbl> <dbl> 2008-08-10 0 0 0 0 2008-08-10 100 100 100 1 2008-08-10 0 100 300 1 2008-08-10 0 100 400 1 2008-08-10 50 150 550 0.27 2009-12-10 0 150 0 0 2009-12-10 50 30 50 0.6 2009-12-10 0 20 50 0.6 = 0对于重复的行,它总是对第一行采用滞后,而对于其他行则继续为0。 / p>

Vol

感谢大家花时间回答。

2 个答案:

答案 0 :(得分:1)

(N,)

答案 1 :(得分:1)

您可以使用accumulate。如果Vol..2)为0,则使用上一个元素(..1),否则使用Vol/CumVol..3

library(tidyverse)

df %>% 
  group_by(Group) %>%
  mutate(answer = 
           as.numeric(accumulate2(Vol, OI/CumVol, ~ if(..2 == 0) ..1 else ..3,
                      .init = 0)[-1]))


# # A tibble: 8 x 6
# # Groups:   Group [2]
#   Group        Vol    OI CumVol    Rd answer
#   <chr>      <int> <int>  <int> <dbl>  <dbl>
# 1 2008-08-10     0     0      0  0     0    
# 2 2008-08-10   100   100    100  1     1    
# 3 2008-08-10     0   100    300  1     1    
# 4 2008-08-10     0   100    400  1     1    
# 5 2008-08-10    50   150    550  0.27  0.273
# 6 2009-12-10     0   150      0  0     0    
# 7 2009-12-10    50    30     50  0.6   0.6  
# 8 2009-12-10     0    20     50  0.6   0.6  

使用的数据

structure(list(Group = c("2008-08-10", "2008-08-10", "2008-08-10", 
"2008-08-10", "2008-08-10", "2009-12-10", "2009-12-10", "2009-12-10"
), Vol = c(0L, 100L, 0L, 0L, 50L, 0L, 50L, 0L), OI = c(0L, 100L, 
100L, 100L, 150L, 150L, 30L, 20L), CumVol = c(0L, 100L, 300L, 
400L, 550L, 0L, 50L, 50L), Rd = c(0, 1, 1, 1, 0.27, 0, 0.6, 0.6
)), row.names = c(NA, -8L), class = "data.frame")