Попробуйте это. Выглядит правильно, но не уверен, работает ли он для ваших данных. Основная идея c состоит в том, чтобы: 1. заменить 0
в W C и FIN на NA, 2. вычислить процентное изменение, 3. заменить 0 в каждом c изменении на NA, за исключением случаев, когда оно идет сразу после NA, 4. используйте fill
, чтобы заполнить NA последним известным значением.
<!-- language-all: lang-r -->
library(dplyr)
library(tidyr)
df <- data.frame(
ISIN = c(rep("BSP951331318", 11), rep("BSP951331319", 11)),
Date = c(as.Date(paste("2010", 1:11, "1", sep = "-")), as.Date(paste("2010", 1:11, "1", sep = "-"))),
WC = c(c(NA, NA, rep(1, 3), rep(2, 3), rep(3, 3)), c(NA, NA, rep(1, 3), rep(2, 3), rep(3, 3))),
FIN = c(c(0, 0, rep(4, 3), rep(5, 3), rep(6, 3)), c(0, 0, rep(4, 3), rep(5, 3), rep(6, 3)))
)
df %>%
group_by(ISIN) %>%
mutate(WC = ifelse(WC %in% c(0), NA, WC),
FIN = ifelse(FIN %in% c(0), NA, FIN),
DeltaWC1 = (WC / lag(WC)) - 1,
DeltaFIN1 = (FIN / lag(FIN)) - 1,
DeltaWC = ifelse(DeltaWC1 %in% c(0) & !is.na(lag(DeltaWC1)), NA, DeltaWC1),
DeltaFIN = ifelse(DeltaFIN1 %in% c(0) & !is.na(lag(DeltaFIN1)), NA, DeltaFIN1)) %>%
fill(DeltaWC, DeltaFIN)
#> # A tibble: 22 x 8
#> # Groups: ISIN [2]
#> ISIN Date WC FIN DeltaWC1 DeltaFIN1 DeltaWC DeltaFIN
#> <fct> <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 BSP951331318 2010-01-01 NA NA NA NA NA NA
#> 2 BSP951331318 2010-02-01 NA NA NA NA NA NA
#> 3 BSP951331318 2010-03-01 1 4 NA NA NA NA
#> 4 BSP951331318 2010-04-01 1 4 0 0 0 0
#> 5 BSP951331318 2010-05-01 1 4 0 0 0 0
#> 6 BSP951331318 2010-06-01 2 5 1 0.25 1 0.25
#> 7 BSP951331318 2010-07-01 2 5 0 0 1 0.25
#> 8 BSP951331318 2010-08-01 2 5 0 0 1 0.25
#> 9 BSP951331318 2010-09-01 3 6 0.5 0.200 0.5 0.200
#> 10 BSP951331318 2010-10-01 3 6 0 0 0.5 0.200
#> # ... with 12 more rows
Создано в 2020-03-16 пакетом Представить (v0.3.0)