Что такое функция бинов в этом коде и как я могу ее использовать? - PullRequest
0 голосов
/ 21 декабря 2018

Проблема в R.

Проблема: Это часть пакетов rfm.Я пытаюсь изменить внутреннюю функцию.Но я сталкиваюсь с проблемой в работе бункеров.Можете ли вы дать мне решение или объяснение?Я также пытаюсь установить binr, но не работает.

Сводка: данные находятся в пакете rfm.Он имеет 3 функции (customer_id, order_date, выручка).

rfm_revision <- function (data = NULL, customer_id = NULL, order_date = NULL, 
           revenue = NULL, analysis_date = NULL, recency_bins = 5, 
           frequency_bins = 5, monetary_bins = 5, ...) 
 {
   cust_id <- enquo(customer_id)
   odate <- enquo(order_date)
   revenues <- enquo(revenue)
   result <- data %>% select(!!cust_id, !!odate, !!revenues) %>% 
     group_by(!!cust_id) %>% summarise(date_most_recent = max(!!odate), 
                                       amount = sum(!!revenues), transaction_count = n()) %>% 
     mutate(recency_days = (analysis_date - date_most_recent)/lubridate::ddays()) %>% 
     select(!!cust_id, date_most_recent, recency_days, transaction_count, 
            amount) %>% set_names(c("customer_id", "date_most_recent", 
                                    "recency_days", "transaction_count", "amount"))
   result$recency_score <- NA
   result$frequency_score <- NA
   result$monetary_score <- NA
   rscore <- recency_bins %>% seq_len() %>% rev()
   if (length(recency_bins) == 1) {
     bins_recency <- bins(result, recency_days, recency_bins)
   }
   else {
     bins_recency <- recency_bins
   }
   lower_recency <- bins_lower(result, recency_days, bins_recency)
   upper_recency <- bins_upper(result, recency_days, bins_recency)
   for (i in seq_len(recency_bins)) {
     result$recency_score[result$recency_days >= lower_recency[i] & 
                            result$recency_days < upper_recency[i]] <- rscore[i]
   }
   fscore <- frequency_bins %>% seq_len() %>% rev()
   if (length(frequency_bins) == 1) {
     bins_frequency <- bins(result, transaction_count, frequency_bins)
   }
   else {
     bins_frequency <- frequency_bins
   }
   lower_frequency <- bins_lower(result, transaction_count, 
                                 bins_frequency)
   upper_frequency <- bins_upper(result, transaction_count, 
                                 bins_frequency)
   for (i in seq_len(frequency_bins)) {
     result$frequency_score[result$transaction_count >= lower_frequency[i] & 
                              result$transaction_count < upper_frequency[i]] <- i
   }
   mscore <- monetary_bins %>% seq_len() %>% rev()
   if (length(monetary_bins) == 1) {
     bins_monetary <- bins(result, amount, monetary_bins)
   }
   else {
     bins_monetary <- monetary_bins
   }
   lower_monetary <- bins_lower(result, amount, bins_monetary)
   upper_monetary <- bins_upper(result, amount, bins_monetary)
   for (i in seq_len(monetary_bins)) {
     result$monetary_score[result$amount >= lower_monetary[i] & 
                             result$amount < upper_monetary[i]] <- i
   }
   result %<>% mutate(rfm_score = recency_score * 100 + frequency_score * 
                        10 + monetary_score) %>% select(customer_id, date_most_recent, 
                                                        recency_days, transaction_count, amount, recency_score, 
                                                        frequency_score, monetary_score, rfm_score)
   result$transaction_count <- as.numeric(result$transaction_count)
   out <- list(rfm = result, analysis_date = analysis_date, 
               frequency_bins = frequency_bins, recency_bins = recency_bins, 
               monetary_bins = monetary_bins)
   class(out) <- c("rfm_table_order", "tibble", "data.frame")
   return(out)
 }
analysis_date <- lubridate::as_date('2006-12-31', tz = 'UTC')
rfm_result <- rfm_revision(rfm_data_orders, customer_id, order_date, revenue, analysis_date)
#Error in bins(result, recency_days, recency_bins) : 
#  could not find function "bins"

1 Ответ

0 голосов
/ 21 декабря 2018

Функция может быть скрытой функцией в пакете.посмотрите, если rfm:::bins что-то делает.Чтобы изменить функцию, если вы используете fix, она должна поддерживать свое окружение и иметь возможность найти все скрытые функции.

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

library(rfm)
orig_rfm_revision <- rfm_revision
rfm_revision <- # insert modified function
environment(rfm_revision) <- environment(orig_rfm_revision)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...