Использование циклов для извлечения данных за определенный диапазон дат в зависимости от значений нескольких столбцов - PullRequest
0 голосов
/ 12 ноября 2018

Прежде всего, спасибо, что нашли время, чтобы посмотреть / ответить на мой вопрос.

Я задавал этот вопрос раньше, хотя и очень непонятно, однако, я думаю, что близок к решению и надеюсьВы можете помочь мне!

У меня есть 2 основных df: Customer (базовая таблица) и Top_Customers (подмножество лучших n клиентов за квартал)

Обе таблицы имеют одинаковую структуру,см. ниже:

Cust_ID   Date    QTR     Sales    Action   Link_Cust_ID
  1      1/1/18  2018 Q1   23       NA       NA
  1      1/2/18  2018 Q1   22.2     NA       NA
  1      1/3/18  2018 Q1   12.1     2        5
  1      1/4/18  2018 Q1   14.1     5        NA
  3      1/1/18  2018 Q1   101      NA       NA
  3      1/2/18  2018 Q1   55       2        18
 ...      ...      ...     ...     ...      ...

Иногда - у клиента может быть ссылка на другого клиента - следовательно, столбец link_cust_id может заполняться идентификатором другого клиента.
Моя цель: если действиестолбец == 2, я хочу включить этого клиента (из Link_Cust_ID) в мою таблицу Top_Customer с даты заполнения link_cust_id до КОНЦА КВАРТАЛА

Например, я бы включил Cust_ID = 5с 1/3/18 по 3/31/18 (конец квартала) из вышеприведенного графика

Я уже некоторое время пытаюсь это сделать и придумала следующий код (который в настоящее времяу не работает, но я думаю, что идея есть)

Linking_ID <- function(data)
{
if (data$link_type == 2)
{
temp.linkid <- data$link_cust_id[i] #stores the linked customer_id
temp.date   <- data$Date[i] #stores the date linking occurs
temp.data   <- customer_data %>% group_by(Quarter) %>% filter(customer_id = temp.linkid & Date >= temp.date)
#the above line of code is suppose to subset only link_customer_id data from the link_date to the end of the quarter
data <- rbind(data, temp.data)
}}

Я не очень хорош с циклами, и стараюсь не использовать их в моем коде, но у меня может не быть выбора в этомситуация.Если вы считаете, что другой способ может быть лучше, предложите его!

dput для базовой таблицы (все клиенты)

    structure(list(Cust_ID = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 5, 5, 5, 5), 
               Date = structure(c(1514764800, 1514851200, 1514937600, 1515024000, 
                                  1514764800, 1514851200, 1514937600, 1515024000, 
                                  1514764800, 1514851200, 1514937600, 1515024000, 
                                  1514764800, 1514851200, 1514937600, 1515024000), 
                                class = c("POSIXct", "POSIXt"), tzone = "UTC"),
               Quarter = c("2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", 
                           "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", 
                           "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", 
                           "2018 Q1"), 
               Sales = c(23, 22.2, 12.1, 14.1, 18, 18.8, 19.2, 19.8, 101, 55, 56, 
                         55, NA, NA, 10.5, 11.1), 
               Action = c(NA, NA, 2, NA, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, NA), 
               Link_Cust_ID = c(NA, NA, 5, NA, NA, NA, NA, NA, NA, 18, NA, NA, NA, NA, NA, NA)), 
          row.names = c(NA, -16L), class = c("tbl_df", "tbl", "data.frame"))

dput для top_customer tble:

structure(list(Cust_ID = c(1, 1, 1, 1, 3, 3, 3, 3), Date = 
structure(c(1514764800, 
1514851200, 1514937600, 1515024000, 1514764800, 1514851200, 1514937600, 
1515024000), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
Quarter = c("2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", 
"2018 Q1", "2018 Q1", "2018 Q1"), Sales = c(23, 22.2, 12.1, 
14.1, 101, 55, 56, 55), Action = c(NA, NA, 2, NA, NA, 2, 
NA, NA), Link_Cust_ID = c(NA, NA, 5, NA, NA, 18, NA, NA)), row.names = c(NA, 
-8L), class = c("tbl_df", "tbl", "data.frame"))

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Вы можете сделать следующее:

Сначала извлеките тех клиентов, у которых есть привязка идентификатора клиента к действию 2, и установите даты окончания квартала.

library(dplyr) 

link_ids_action2 <- customer %>% 
  select(Cust_ID, Action, Link_Cust_ID, Date, Quarter) %>% 
  filter(Action == 2) %>% 
  mutate(Quarter_end_dates = case_when(grepl("Q1", Quarter) ~ "2018-03-31", 
                                       grepl("Q2", Quarter) ~ "2018-06-30", 
                                       grepl("Q3", Quarter) ~ "2018-09-30", 
                                       grepl("Q4", Quarter) ~ "2018-12-31"), 
         Quarter_end_dates = as.Date(Quarter_end_dates)) %>% 
  select(Link_Cust_ID, New_Cust_ID = Cust_ID, Start_date = Date, Quarter_end_dates)

link_ids_action2
# A tibble: 2 x 4
#   Link_Cust_ID New_Cust_ID Start_date          Quarter_end_dates
#          <dbl>       <dbl> <dttm>              <date>           
# 1            5           1 2018-01-03 00:00:00 2018-03-31       
# 2           18           3 2018-01-02 00:00:00 2018-03-31     

Право присоединиться к исходному фрейму данных, который дает вам только те, которые являются связанными клиентами и фильтруют по датам. Мне пришлось добавить as.Dates, чтобы правильно фильтровать дату и время. Выберите только те столбцы, которые вам нужны для ваших top_customer данных.

new_top_customers <- 
  right_join(customer, link_ids_action2, by = c("Cust_ID" = "Link_Cust_ID")) %>% 
  filter(as.Date(Date) >= as.Date(Start_date), as.Date(Date) <= Quarter_end_dates) %>% 
  select(Cust_ID, Date, Quarter, Sales, Action, Link_Cust_ID)

new_top_customers
# A tibble: 2 x 6
#   Cust_ID Date                Quarter Sales Action Link_Cust_ID
#     <dbl> <dttm>              <chr>   <dbl>  <dbl>        <dbl>
# 1       5 2018-01-03 00:00:00 2018 Q1  10.5     NA           NA
# 2       5 2018-01-04 00:00:00 2018 Q1  11.1     NA           NA

Нет, с помощью bind_rows вы можете добавить новых топ-клиентов:

bind_rows(top_customer, new_top_customers)

# A tibble: 10 x 6
#    Cust_ID Date                Quarter Sales Action Link_Cust_ID
#      <dbl> <dttm>              <chr>   <dbl>  <dbl>        <dbl>
#  1       1 2018-01-01 00:00:00 2018 Q1  23       NA           NA
#  2       1 2018-01-02 00:00:00 2018 Q1  22.2     NA           NA
#  3       1 2018-01-03 00:00:00 2018 Q1  12.1      2            5
#  4       1 2018-01-04 00:00:00 2018 Q1  14.1     NA           NA
#  5       3 2018-01-01 00:00:00 2018 Q1 101       NA           NA
#  6       3 2018-01-02 00:00:00 2018 Q1  55        2           18
#  7       3 2018-01-03 00:00:00 2018 Q1  56       NA           NA
#  8       3 2018-01-04 00:00:00 2018 Q1  55       NA           NA
#  9       5 2018-01-03 00:00:00 2018 Q1  10.5     NA           NA
# 10       5 2018-01-04 00:00:00 2018 Q1  11.1     NA           NA

Данные

customer <- structure(list(Cust_ID = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 5, 5, 5, 5), 
                           Date = structure(c(1514764800, 1514851200, 1514937600, 1515024000, 
                                              1514764800, 1514851200, 1514937600, 1515024000, 
                                              1514764800, 1514851200, 1514937600, 1515024000, 
                                              1514764800, 1514851200, 1514937600, 1515024000), 
                                            class = c("POSIXct", "POSIXt"), tzone = "UTC"),
                           Quarter = c("2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", 
                                       "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", 
                                       "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", 
                                       "2018 Q1"), 
                           Sales = c(23, 22.2, 12.1, 14.1, 18, 18.8, 19.2, 19.8, 101, 55, 56, 
                                     55, NA, NA, 10.5, 11.1), 
                           Action = c(NA, NA, 2, NA, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, NA), 
                           Link_Cust_ID = c(NA, NA, 5, NA, NA, NA, NA, NA, NA, 18, NA, NA, NA, NA, NA, NA)), 
                      row.names = c(NA, -16L), class = c("tbl_df", "tbl", "data.frame"))


top_customer <- structure(list(Cust_ID = c(1, 1, 1, 1, 3, 3, 3, 3), 
                               Date = structure(c(1514764800, 1514851200, 1514937600, 1515024000, 
                                                  1514764800, 1514851200, 1514937600, 1515024000), 
                                                class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
                               Quarter = c("2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", 
                                           "2018 Q1", "2018 Q1", "2018 Q1"), 
                               Sales = c(23, 22.2, 12.1, 14.1, 101, 55, 56, 55), 
                               Action = c(NA, NA, 2, NA, NA, 2, NA, NA), 
                               Link_Cust_ID = c(NA, NA, 5, NA, NA, 18, NA, NA)), 
                          row.names = c(NA, -8L), class = c("tbl_df", "tbl", "data.frame"))
0 голосов
/ 12 ноября 2018

Я думаю, что это может помочь.Вам не нужно делать петли здесь.

all_cust <-  structure(list(Cust_ID = c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 5, 5, 5, 5), 
Date = structure(c(1514764800, 1514851200, 1514937600, 1515024000, 
1514764800, 1514851200, 1514937600, 1515024000, 
1514764800, 1514851200, 1514937600, 1515024000, 
1514764800, 1514851200, 1514937600, 1515024000), 
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
Quarter = c("2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", 
"2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", 
"2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", 
"2018 Q1"), 
Sales = c(23, 22.2, 12.1, 14.1, 18, 18.8, 19.2, 19.8, 101, 55, 56, 
55, NA, NA, 10.5, 11.1), 
Action = c(NA, NA, 2, NA, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, NA), 
Link_Cust_ID = c(NA, NA, 5, NA, NA, NA, NA, NA, NA, 18, NA, NA, NA, NA, NA, NA)), 
row.names = c(NA, -16L), class = c("tbl_df", "tbl", "data.frame"))

top_cust <- structure(list(Cust_ID = c(1, 1, 1, 1, 3, 3, 3, 3), Date = 
structure(c(1514764800, 
1514851200, 1514937600, 1515024000, 1514764800, 1514851200, 1514937600, 
1515024000), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
Quarter = c("2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", "2018 Q1", 
"2018 Q1", "2018 Q1", "2018 Q1"), Sales = c(23, 22.2, 12.1, 
14.1, 101, 55, 56, 55), Action = c(NA, NA, 2, NA, NA, 2, 
NA, NA), Link_Cust_ID = c(NA, NA, 5, NA, NA, 18, NA, NA)), row.names = c(NA, 
-8L), class = c("tbl_df", "tbl", "data.frame"))


library(dplyr)
#get where action is equal to 2
top_cust2 <- filter(top_cust, Action == 2)
#join on cust_id to link_cust_id
#Then filter where date is greater or equal too 
#reference date and in the same quarter
   bth <- inner_join(all_cust,top_cust2, 
                  by =c("Cust_ID"="Link_Cust_ID")) %>% 
        filter(Date.x >= Date.y, Quarter.x == Quarter.y) 
#remove .y columns from all_cust
bth <- bth[,!grepl(".y",colnames(bth))]
#drop .x from variable names
colnames(bth) <- gsub(".x","",colnames(bth))

cmb <- bind_rows(top_cust, bth)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...