Как я могу реализовать динамический счет в R без использования цикла for? - PullRequest
0 голосов
/ 28 мая 2019

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

У меня есть код, который успешно решает эту проблему; однако он использует цикл for и занимает слишком много времени, потому что существуют десятки тысяч SKU. Вот краткий пример того, как выглядит моя таблица SKU:

SKUID <- c('123', '456', '789')
NumberOfCustomers <- c(204543, 92703, 305727)
SKUFirstPurchase <- c('2014-05-02', '2014-02-03', '2016-05-13')
SKULastPurchase <- c('2017-09-30', '2018-07-01', '2019-01-09')

SKUCount <- data.frame(SKUID, NumberOfCustomers, 
                       SKUFirstPurchase, SKULastPurchase)
colnames(SKUCount) <- c('SKU', 'NumberOfCustomers', 
                        'FirstPurchase', 'LastPurchase')

Затем у меня есть еще одна таблица, длина которой составляет около 6 миллионов строк, выборка, отличная от даты продажи и CustomerID, который я называю OrderTable. Я не могу суммировать данные об отдельных счетах на ежедневной основе и суммировать их вместе, потому что это удвоило бы количество клиентов, которые приобрели в отдельные дни. Я должен пересчитать различное количество с каждой перестановкой FirstPurchase / LastPurchase, которую я вижу в своей таблице SKUCount. Оттуда я использую следующий код для вычисления различного числа клиентов в данный период времени:

library(dplyr)

for (i in 1:nrow(SKUCount))
{
  SKUCount[i, c('DateCustomers')] <-
    sapply(OrderTable %>%
              filter(Date >= SKUCount[i,'FirstPurchase'],
                     Date <= SKUCount[i,'LastPurchase']) %>%
              select(CustomerID),
           function(x) length(unique(x)))
}

Как я уже отмечал, этот фрагмент кода работает, но он очень медленный (~ 0,5 секунды для каждой строки). Есть ли более быстрый способ подсчета различных показателей или есть более разумное решение моей проблемы?

1 Ответ

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

Попробуйте это:

    library("purrrlyr")
    library("dplyr")

#First creating the datasets including OrderTable (please correct me if I got it wrong!):
    SKUID <- c('123', '456', '789')
    NumberOfCustomers <- c(204543, 92703, 305727)
    SKUFirstPurchase <- c('2014-05-02', '2014-02-03', '2016-05-13')
    SKULastPurchase <- c('2017-09-30', '2018-07-01', '2019-01-09')

    SKUCount <- data.frame(SKUID, NumberOfCustomers, 
                           SKUFirstPurchase, SKULastPurchase)
    colnames(SKUCount) <- c('SKU', 'NumberOfCustomers', 
                            'FirstPurchase', 'LastPurchase')

    OrderTable <- data.frame(Date=c('2014-06-02', '2014-08-02', '2015-02-03', '2017-05-13'
    ,'2015-05-02', '2014-06-03', '2016-07-13', '2017-09-30', '2018-07-01', '2019-01-09'),
    CustomerID=c('121','212','3434','24232','121','124','212','131','412','3634'))

#changing factors to date
    SKUCount$FirstPurchase<-as.Date(SKUCount$FirstPurchase,format = "%Y-%m-%d")
    SKUCount$LastPurchase<-as.Date(SKUCount$LastPurchase,format = "%Y-%m-%d")
    OrderTable$Date<-as.Date(OrderTable$Date,format = "%Y-%m-%d")

#defining a function, named FUN, which limit the Date from OrderTable between 
#the two date arguments (FirstPurchase and LastPurchase) and returns the 
#distinct count of CustomerID's from OrderTable:
FUN <- function(FirstPurchase,LastPurchase){
              Rtrn<-OrderTable %>%
              filter(Date >= FirstPurchase,
              Date <= LastPurchase)  %>%
              summarize(n_distinct(CustomerID))
              as.numeric(Rtrn)
              }

Далее вы хотите взять свой набор данных SKUCount и создать переменную с именем DateCustomers, применив функцию FUN к каждой ее строке:

    SKUCount %>% 
      rowwise() %>% 
       mutate(DateCustomers= FUN(FirstPurchase,LastPurchase))
      # Source: local data frame [3 x 5]
      # Groups: <by row>
      #   
      #   # A tibble: 3 x 5
      #   SKU   NumberOfCustomers FirstPurchase LastPurchase DateCustomers
      # <fct>             <dbl> <date>        <date>               <dbl>
      #   1 123              204543 2014-05-02    2017-09-30          6
      # 2 456               92703 2014-02-03    2018-07-01            7
      # 3 789              305727 2016-05-13    2019-01-09            5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...