Попытка найти процентное изменение долларов между неделями в группах R

#r #dplyr #lag #difference

Вопрос:

У меня есть df (который намного больше), похожий на следующий:

 df = data.frame(r_id = c(1, 1 ,1, 1, 2,2,2,2, 3,3,3,3), s_id = c(1,2,3,4,5,6,7,8,9,10, 11,12),
                week = c(2021080801, 2021080101, 2021072501, 2021071801, 2021080801, 2021080101, 2021072501, 2021071801, 2021080801, 2021080101, 2021072501, 2021071801),
                price = c(96992.88, 104458.36, 106485.10, 105094.09, 103550.74, 
                          104990.28, 109912.51, 116662.20, 113178.26, 111779.15, 120553.04, 123132.30))
 

столбец r_id группируется в разные категории. Каждая группа содержит определенное количество недель и соответствующую сумму в долларах за каждую неделю. Я пытаюсь найти процентное изменение между каждой суммой в долларах за предыдущую неделю в каждой группе и сохранить его в отдельной колонке в кадре данных. Например, для r_id 1 я хочу рассчитать процентную разницу между неделей 2021080801 и неделей 2021080101, затем неделей 2021080101 и неделей 2021072501 и так далее. Однако неделя 2021071801 не будет иметь никаких процентных изменений, потому что в группах ей не предшествует неделя.

Я знаю, как получить разницу, просто используя лаг, выполнив:

 df = df %>% group_by(r_id) %>%
  mutate(change = price - lag(price))*100/lag(price))


 

Но порядок меняется на противоположный, и проценты, применяемые к моему большему набору данных, кажутся неправильными…

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

1. В вашем коде у вас неуместны скобки mutate . Можете ли вы показать свой ожидаемый результат?

Ответ №1:

Возможно, использовать lead

 library(dplyr)
df %>% 
    group_by(r_id) %>%
    mutate(change = (price - lead(price)) * 100 /lead(price))