#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:
Мы можем сделать это с помощью группы по «запаздыванию», а затем выполнить разницу
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