Рассмотрим следующий пример:
library(tidyverse)
library(lubridate)
df = tibble(client_id = rep(1:3, each=24),
date = rep(seq(ymd("2016-01-01"), (ymd("2016-12-01") + years(1)), by='month'), 3),
expenditure = runif(72))
В df
вы сохранили информацию о ежемесячных расходах от группы клиентов за последние 2 года. Теперь вы хотите рассчитать ежемесячную разницу между этим и предыдущим годом для каждого клиента.
Есть ли способ сделать это, поддерживая "длинный" формат набора данных? Здесь я покажу вам, как я это делаю в настоящее время, что подразумевает широкое распространение:
df2 = df %>%
mutate(date2 = paste0('val_',
year(date),
formatC(month(date), width=2, flag="0"))) %>%
select(client_id, date2, value) %>%
pivot_wider(names_from = date2,
values_from = value)
df3 = (df2[,2:13] - df2[,14:25])
Однако я нахожу их ненужными сложными, и в больших наборах данных переход от длинного к широкому может занять довольно много времени, поэтому я думаю, что должен быть лучший способ сделать это.