Выберите 12 различных столбцов для каждой записи на основе условного столбца в R - PullRequest
0 голосов
/ 29 мая 2019

enter image description here

Итак, у меня есть вышеуказанный набор данных, где каждая строка представляет советника. Pol_Month представляет месяц первой транзакции. Начиная с месяца 1 транзакции, мне нужно отслеживать его транзакции в течение 12 месяцев. Например, для Adv 'S301' его первая транзакция совершается в январе месяце, следовательно, с января_APE по FY1819_De December_APE его транзакции должны регистрироваться в рамках Месяца 1, Месяца 2…. Month12 Если первый месяц транзакции до апреля, отсчет 12 месяцев начинается с апреля. Итак, в основном, для каждой записи мне нужно начать обход столбцов с Pol_Month и записать значения до 12-го месяца. Если Pol_Month - март, обход начинается с апреля.

Ожидаемый результат:

Adv_Code    Pol_Month   Month1_APE  Month2_APE  Month3_APE  Month4_APE  Month5_APE  Month6_APE  Month7_APE  Month8_APE  Month9_APE  Month10_APE Month11_APE Month12_APE
A299        March       0           0           0           0           0           0           0           0           0           0           0           0
A298        NA          0           0           0           0           0           0           0           0           0           0           0           0
S300        NA          0           0           0           0           0           0           0           0           0           0           0           0
S301        January     19101       0           0           0           0           0           19000       0           0           0           0           0
A299        March       0           0           0           0           0           0           0           0           0           0           0           0
A298        March       0           0           0           0           0           0           0           0           0           0           0           0
S300        March       0           0           0           0           0           0           0           0           0           0           0           0
S301        March       0           0           0           0           0           0           0           0           0           0           0           0
S300        March       0           0           0           0           0           0           0           0           0           0           0           0
S301        April       15413       29798       70010       20342       24521       20550       0           0           25920       0           0           0

Может кто-нибудь, пожалуйста, помогите мне с этим?

ниже приведен код для воспроизведения df:

df <- structure(list(Adv_Code = structure(c(2L, 1L, 3L,4L,2L,1L,3L,4L,3L,4L), .Label = c("A298","A299", "S300","S301","S302","S303","S304","S305","S309"), class = "factor"),
                     #Pol_Dt = structure(c(2L,3L, 2L,2L,2L,3L,2L,3L,2L,3L), .Label = c("03/31/2017", NA, NA,"1/30/2018","3/31/2017","3/31/2017","3/31/2017","3/31/2017","3/31/2017","4/25/2017"), class = "factor"), 
                     Pol_Month = structure(1:10, .Label = c("March",NA,NA,"January","March","March","March","March","March","April"), class = "factor"),
                     April_APE = c(0L, 0L, 0L,0L,0L,0L,0L,0L,0L,15413L), 
                     May_APE = c(0L, 0L, 0L,0L,0L,0L,0L,0L,0L,29798L), June_APE = c(0L, 0L, 0L,0L,0L,0L,0L,0L,0L,70010L), July_APE = c(0L, 0L, 0L,0L,0L,0L,0L,0L,0L,20342L),
                     August_APE = c(0L, 0L, 0L,0L,0L,0L,0L,0L,0L,24521L), September_APE = c(0L, 0L, 0L,0L,0L,0L,0L,0L,0L,20550L), October_APE = c(0L, 0L, 0L,0L,0L,0L,0L,0L,0L,0L),
                     November_APE = c(0L, 0L, 0L,0L,0L,0L,0L,0L,0L,0L),December_APE = c(0L, 0L, 0L,0L,0L,0L,0L,0L,0L,25920L), January_APE = c(0L, 0L, 0L,19101L,0L,0L,0L,0L,0L,0L),
                     February_APE = c(0L, 0L, 0L,0L,0L,0L,0L,0L,0L,0L), March_APE = c(0L, 0L, 0L,0L,0L,0L,0L,0L,0L,0L),
                     FY1819_April_APE = c(NA,NA,NA,0L,NA,NA,NA,NA,NA,16440L),FY1819_May_APE = c(NA,NA,NA,0L,NA,NA,NA,NA,NA,16440L),
                     FY1819_June_APE = c(NA,NA,NA,0L,NA,NA,NA,NA,NA,0L),FY1819_July_APE = c(NA,NA,NA,19000L,NA,NA,NA,NA,NA,0L),
                     FY1819_August_APE = c(NA,NA,NA,0L,NA,NA,NA,NA,NA,15413L),FY1819_September_APE = c(NA,NA,NA,0L,NA,NA,NA,NA,NA,0L),
                     FY1819_October_APE = c(NA,NA,NA,0L,NA,NA,NA,NA,NA,0L),FY1819_November_APE = c(NA,NA,NA,0L,NA,NA,NA,NA,NA,0L),FY1819_December_APE = c(NA,NA,NA,0L,NA,NA,NA,NA,NA,0L),
                     FY1819_January_APE = c(NA,NA,NA,0L,NA,NA,NA,NA,NA,0L),FY1819_February_APE = c(NA,NA,NA,0L,NA,NA,NA,NA,NA,15413L),FY1819_March_APE = c(NA,NA,NA,0L,NA,NA,NA,NA,NA,0L)),
                class = "data.frame", row.names = c(NA, -10L))

Может ли кто-нибудь любезно помочь!

1 Ответ

2 голосов
/ 29 мая 2019

Вот один вариант, используя apply. Для каждой строки мы возвращаем фиксированные первые 12 значений, если Pol_Month столбец равен NA, если это не так, мы изменяем month_name на "April", если он присутствует в первые 3 месяца else, оставляем его как есть и выбираем 12 значений, в которых присутствует столбец со значением month_name.

outdf <- df[1:2]

outdf[paste0("Month", 1:12, "_APE")] <- t(apply(df, 1, function(x) {
       if (is.na(x[["Pol_Month"]])) 
             x[3:14] 
       else {
          month_name <- if (match(x[["Pol_Month"]], month.name) < 4) "April" else x[["Pol_Month"]]
          ind <- which.max(grepl(month_name, names(df)))
          x[ind : (ind + 11)]
         }
}))

outdf[1:7]

#   Adv_Code Pol_Month Month1_APE Month2_APE Month3_APE Month4_APE Month5_APE
#1      A299     March          0          0          0          0          0
#2      A298      <NA>          0          0          0          0          0
#3      S300      <NA>          0          0          0          0          0
#4      S301   January          0          0          0          0          0
#5      A299     March          0          0          0          0          0
#6      A298     March          0          0          0          0          0
#7      S300     March          0          0          0          0          0
#8      S301     March          0          0          0          0          0
#9      S300     March          0          0          0          0          0
#10     S301     April      15413      29798      70010      20342      24521

Вот версия dplyr / tidyr, использующая ту же логику

library(dplyr)
library(tidyr)

df %>%
   mutate(row = row_number()) %>%
   gather(key, value, -c(1:2, row)) %>%
   group_by(row) %>%
   slice(if(is.na(first(Pol_Month))) 1:12 else {ind = max(match(first(Pol_Month), month.name), 4); ind : (ind + 11) }) %>%
   mutate(key = paste0("Month", 1:12, "_APE")) %>%
   spread(key, value) %>%
   select(-row)
...