Функция R для расширения таблицы на каждый месяц, учитывая начальный и конечный месяц - PullRequest
1 голос
/ 27 апреля 2019

У меня есть набор данных в R, относящийся к эффективному месяцу (продолжительности) цены начала и окончания.Ниже приведен пример:

print(df)

    Customer Product Price Start_Month End_Month
    ABC      XYZ     100   Jan         Jun
    ABC      XYZ     150   Jul         Dec

Мне нужно написать код / ​​функцию, которая может расходовать эту таблицу на каждый месяц.Мой ожидаемый результат следующий:

Customer Product Price Month
ABC      XYZ     100   Jan
ABC      XYZ     100   Feb
ABC      XYZ     100   Mar
ABC      XYZ     100   Apr
ABC      XYZ     100   May
ABC      XYZ     100   Jun
ABC      XYZ     150   Jul
ABC      XYZ     150   Aug
ABC      XYZ     150   Sep
ABC      XYZ     150   Oct
ABC      XYZ     150   Nov
ABC      XYZ     150   Dec

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

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019

Подход tidyverse будет заключаться в преобразовании кадра данных в длинный формат, чтобы теперь у нас было две строки для каждой строки в исходном кадре данных. Теперь для каждой строки мы используем match, чтобы получить индекс значения месяца в начале и конце месяца, а затем используем его, чтобы создать последовательность.

library(tidyverse)

df %>%
  gather(key, Month, -(1:3)) %>%
  group_by_at(1:3) %>%
  complete(Month = month.abb[match(Month[1], month.abb):
                             match(Month[2], month.abb)]) %>%
  arrange(Customer, Product, Price, match(Month, month.abb)) %>%
  select(-key)


#  Customer Product Price Month
#   <fct>    <fct>   <int> <chr>
# 1 ABC      XYZ       100 Jan  
# 2 ABC      XYZ       100 Feb  
# 3 ABC      XYZ       100 Mar  
# 4 ABC      XYZ       100 Apr  
# 5 ABC      XYZ       100 May  
# 6 ABC      XYZ       100 Jun  
# 7 ABC      XYZ       150 Jul  
# 8 ABC      XYZ       150 Aug  
# 9 ABC      XYZ       150 Sep  
#10 ABC      XYZ       150 Oct  
#11 ABC      XYZ       150 Nov  
#12 ABC      XYZ       150 Dec  

Или другой вариант, используя map2

df %>%
  mutate(Month = map2(Start_Month, End_Month,
                ~month.abb[match(.x, month.abb) : match(.y, month.abb)])) %>%
  unnest() %>%
  select(-Start_Month, -End_Month)

который в базе R будет использовать Map

do.call(rbind, Map(function(x, y, z) cbind(df[z,], 
       Month = month.abb[match(x, month.abb) : match(y, month.abb)]),
   df$Start_Month, df$End_Month, seq_len(nrow(df))))

Здесь мы используем встроенный вектор month.abb, чтобы получить последовательность

month.abb
# [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
1 голос
/ 27 апреля 2019

Использование базы r:

do.call(rbind,lapply(1:nrow(df), 
                             function(x) {
                                      cbind(df[x], 
                                      data.frame(Months=
                                                month.abb[which(month.abb==df[x]$Start_Month):
                                                          which(month.abb==df[x]$End_Month)]))
                                }))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...