Группой, заменяющей 0 значений последним известным значением, в то время как NA остаются - PullRequest
0 голосов
/ 16 марта 2020

Я рассчитал процентное изменение переменных W C и FIN, используя следующий код:

CombData %>%
  group_by(ISIN) %>%
  mutate(DeltaWC = (WC/lag(WC)-1))
CombData %>%
  group_by(ISIN) %>%
  mutate(DeltaFIN = (FIN/lag(FIN)-1))

Это привело к следующему выводу:

       ISIN            Date   Ticker  FINA      FINL    WC      DeltaWC         FIN     DeltaFIN
1   BSP951331318    31-01-2010  UIE   0         0       NA      NA              0       NA
2   BSP951331318    28-02-2010  UIE   0         0       NA      NA              0       NaN
3   BSP951331318    31-03-2010  UIE   369.193   0       4.674   NA              369.193 Inf
4   BSP951331318    30-04-2010  UIE   369.193   0       4.674   0               369.193 0
5   BSP951331318    31-05-2010  UIE   369.193   0       4.674   0               369.193 0
6   BSP951331318    30-06-2010  UIE   363.848   2.426   15.934  2.409071459     361.422 -0.021048611
7   BSP951331318    31-07-2010  UIE   363.848   2.426   15.934  0               361.422 0
8   BSP951331318    31-08-2010  UIE   363.848   2.426   15.934  0               361.422 0
9   BSP951331318    30-09-2010  UIE   401.882   2.426   7.454   -0.532195306    399.456 0.105234324
10  BSP951331318    31-10-2010  UIE   401.882   2.426   7.454   0               399.456 0
11  BSP951331318    30-11-2010  UIE   401.882   2.426   7.454   0               399.456 0
12  BSP951331318    31-12-2010  UIE   410.205   2.426   16.25   1.180037564     407.779 0.020835837

This это не совсем вывод, который я ищу. Вместо этого я хотел бы, чтобы выходные данные выглядели следующим образом:

       ISIN            Date   Ticker  FINA      FINL    WC      DeltaWC         FIN     DeltaFIN
1   BSP951331318    31-01-2010  UIE   0         0       NA      NA              NA      NA
2   BSP951331318    28-02-2010  UIE   0         0       NA      NA              NA      NA
3   BSP951331318    31-03-2010  UIE   369.193   0       4.674   NA              369.193 NA
4   BSP951331318    30-04-2010  UIE   369.193   0       4.674   0               369.193 0
5   BSP951331318    31-05-2010  UIE   369.193   0       4.674   0               369.193 0
6   BSP951331318    30-06-2010  UIE   363.848   2.426   15.934  2.409071459     361.422 -0.021048611
7   BSP951331318    31-07-2010  UIE   363.848   2.426   15.934  2.409071459     361.422 -0.021048611
8   BSP951331318    31-08-2010  UIE   363.848   2.426   15.934  2.409071459     361.422 -0.021048611
9   BSP951331318    30-09-2010  UIE   401.882   2.426   7.454   -0.532195306    399.456 0.105234324
10  BSP951331318    31-10-2010  UIE   401.882   2.426   7.454   -0.532195306    399.456 0.105234324
11  BSP951331318    30-11-2010  UIE   401.882   2.426   7.454   -0.532195306    399.456 0.105234324
12  BSP951331318    31-12-2010  UIE   410.205   2.426   16.25   1.180037564     407.779 0.020835837

Этот процесс следует повторить в функции by_group для переменной ISIN.

Любые советы или помощь в преобразовании моих данных значительно оценили

1 Ответ

0 голосов
/ 17 марта 2020

Попробуйте это. Выглядит правильно, но не уверен, работает ли он для ваших данных. Основная идея 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)

...