Преобразование данных для временных рядов - PullRequest
0 голосов
/ 24 февраля 2020

Вот пример моего фактического набора данных:

library("tidyverse")
year <- c(2015,2015,2015,2016,2016,2016,2016)
period <- c("P1","P2","P3","P1","P2","P3","P4")
value <- c(120,130,25,114,236,541,248)
dete <- as.tibble(data.frame(year = year,periode = period, value = value))

Итак, в этом наборе данных у нас есть: Год ... год, период, это как месяц (эквивалент 4 недель из 12 ) значение, некоторое значение продаж, например

Моя проблема заключается в следующем: я хочу, чтобы в выводе был столбец, который показывает мне максимальное (значение) каждого года, например:

result <- as.tibble(data.frame(period = c("P1","P2","P3","P4"), occurence = c(0,1,1,0)))

Но я также хочу добавить к этому вес, в этом случае в 2016 году было 4 периода из 12 (12 месяцев в году), а в 2015 году - только 3. Соответствующий результат будет:

result <- as.tibble(data.frame(period = c("P1","P2","P3","P4"), occurence = c(0,3/12,4/12,0)))

обычно у меня 12 периодов, но иногда за последний год у меня есть только его часть.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Вы сказали:

Я хочу иметь в выводе тиббл, который показывает мне максимум (значение) каждого года ... взвешенный по числу периодов в каждом году.

Итак, я предполагаю, что вы хотите это:

dete %>%
  group_by(year) %>%
  mutate(n=n()) %>%
  summarise(max.value=max(value), weight=mean(n) / 12, 
            occurrence=max.value*weight) %>%
  select(-max.value, -weight) # Optional

# A tibble: 2 x 4
   year max.value weight occurence
  <dbl>     <dbl>  <dbl>     <dbl>
1  2015       130  0.25       32.5
2  2016       541  0.333     180. 

Я не понимаю, почему у вас есть период в выходных данных, когда вы упомянули, что хотели по годам.

0 голосов
/ 24 февраля 2020

Не совсем ваш вывод,

dete %>% 
  group_by(year) %>% 
  mutate(occurence_weighted = n() /12,
         max_occurance = paste0("P", max(as.numeric(gsub("P","",periode)))))

даст вам

 year periode value occurence_weighted max_occurance
  <dbl> <fct>   <dbl>              <dbl> <chr>        
1  2015 P1        120              0.25  P3           
2  2015 P2        130              0.25  P3           
3  2015 P3         25              0.25  P3           
4  2016 P1        114              0.333 P4           
5  2016 P2        236              0.333 P4           
6  2016 P3        541              0.333 P4           
7  2016 P4        248              0.333 P4 

удаление избыточных столбцов даст вам:

dete %>% 
  group_by(year) %>% 
  mutate(occurence_weighted = n() /12,
         max_occurance = paste0("P", max(as.numeric(gsub("P","",periode))))) %>%
  select(year, occurence_weighted, max_occurance ) %>%
  distinct()

   year occurence_weighted max_occurance
  <dbl>              <dbl> <chr>        
1  2015              0.25  P3           
2  2016              0.333 P4  
...