我正在尝试创建一个新变量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
感谢大家花时间回答。
答案 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")