значение отставания по группе с неполной и нерегулярной переменной времени - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть df, который выглядит примерно так:

year <- c(2000,2000,2000,2002,2002,2002,2003,2003,2003,2006,2006,2006)
type <- c("A","B","C","A","B","C","A","B","C","A","B","C")
value <- c(71,80,99,79,61,62,56,88,50,85,56,85)
df <- data.frame(year, type, value)
rm(year, type, value)

Я пытаюсь сделать такой график:

enter image description here

, которые указывают для каждой группы (A, B, C) изменение (%) по сравнению с предыдущим годом.Проблема заключается в том, что иногда предшествующий год равен -1, иногда -2 или -3 и т. Д.

year  type  value   lag     %
2000    A   71      
2000    B   80      
2000    C   99      
2002    A   79       8       0,112676056
2002    B   61      -19     -0,2375
2002    C   62      -37     -0,373737374
2003    A   56      -23     -0,291139241
2003    B   88       27      0,442622951
2003    C   50      -12     -0,193548387
2006    A   85       29      0,517857143
2006    B   56      -32     -0,363636364
2006    C   85       35      0,7

Мой вопрос разделен на 2:

  1. как правильно рассчитать значение задержки?

  2. Есть ли быстрый способ рассчитать% изменения по сравнению с предыдущим годом как ref?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2019

Рассмотрим базовые R ave для расчета лаг с diff и расчета процентного изменения:

df <- cbind.data.frame(year, type, value)

df <- within(df, {
          lag <- ave(value, type, FUN=function(x) c(NA, diff(x)))
          prev <- ave(value, type, FUN=function(x) c(NA, x[1:length(x)-1]))

          pct <- ifelse(is.na(prev), NA, lag / prev)
          rm(prev)
    })

df

#    year type value        pct lag
# 1  2000    A    71         NA  NA
# 2  2000    B    80         NA  NA
# 3  2000    C    99         NA  NA
# 4  2002    A    79  0.1126761   8
# 5  2002    B    61 -0.2375000 -19
# 6  2002    C    62 -0.3737374 -37
# 7  2003    A    56 -0.2911392 -23
# 8  2003    B    88  0.4426230  27
# 9  2003    C    50 -0.1935484 -12
# 10 2006    A    85  0.5178571  29
# 11 2006    B    56 -0.3636364 -32
# 12 2006    C    85  0.7000000  35
0 голосов
/ 22 апреля 2019

Мы можем сделать это группой по 'лагу', а затем сделать разницу

library(dplyr)
df %>%
   group_by(type) %>%
   mutate(lag = value - lag(value),
          perc = lag/lag(value))
# A tibble: 12 x 5
# Groups:   type [3]
#    year type  value   lag    perc
#   <dbl> <fct> <dbl> <dbl>   <dbl>
# 1  2000 A        71    NA  NA    
# 2  2000 B        80    NA  NA    
# 3  2000 C        99    NA  NA    
# 4  2002 A        79     8   0.113
# 5  2002 B        61   -19  -0.238
# 6  2002 C        62   -37  -0.374
# 7  2003 A        56   -23  -0.291
# 8  2003 B        88    27   0.443
# 9  2003 C        50   -12  -0.194
#10  2006 A        85    29   0.518
#11  2006 B        56   -32  -0.364
#12  2006 C        85    35   0.7  

data

df <- data.frame(year, type, value)
...