这段代码中的bins功能是什么,我该如何使用它?

时间:2018-12-21 10:30:17

标签: r classification customer

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 :(得分:0)

该函数可能是软件包中的隐藏函数。查看rfm:::bins是否做某事。要修改该函数,如果使用fix,则它应保持其环境并能够找到所有隐藏的函数。

或者,如果您需要可追溯或可重用的解决方案,则需要在修改后将环境设置为软件包的环境。

library(rfm)
orig_rfm_revision <- rfm_revision
rfm_revision <- # insert modified function
environment(rfm_revision) <- environment(orig_rfm_revision)