значение задержки по группе с неполной и нерегулярной временной переменной

#r #grouping #lag

#r #группировка #задержка

Вопрос:

У меня есть 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)
  

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

введите описание изображения здесь

которые указывают для каждой группы (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. есть ли быстрый способ вычислить % изменения с предыдущим годом в качестве ссылки?

Ответ №1:

Мы можем сделать это с помощью группы по «запаздыванию», а затем выполнить разницу

 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  
  

данные

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

Комментарии:

1. Это то, что я сделал! Я также сделал это с arrange(year) . Это не работает на моей стороне, ни с моим df, ни с моим примером. (в этом примере я получаю следующее сообщение об ошибке: «Ошибка в методе использования («group_by_»): «)

2. @TeYaP Я использую только ваш пример, но не с матрицей ( cbind -создает matrix ), а на data.frame (проверьте мои данные). У меня все работает нормально

3. Я имею в виду, что это работает с этим примером, но не с моим полным df

4. @TeYaP Если вы можете предоставить dput небольшого примера, который не работает, тогда это было бы полезно

Ответ №2:

Рассмотрим базовые 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