2016-04-27 3 views
1

Ich versuche, einen Datenrahmen zu erstellen 10 Perzentile auf der Grundlage der Aktualität, Häufigkeit und Monetary zu berechnen. Ich habe das meiste davon eingerichtet, aber ich kann nicht herausfinden, warum mein Code drei NTILES zurückgibt, wenn ich nach 10 frage. Ich stehe momentan still. Im nächsten Schritt wird der Prozentsatz der Kunden in jedem ntil berechnet.Computing NTILE in R für RFM-Analyse

Hier ist mein Code:

rm(list = ls()) 
setwd("/Users/a76475/Documents/Customer_Analytics") 
rfm<-read.csv("cdnow_students_transaction.csv") 

#Set up test and calibration samples 
rfm$DATE <- as.Date(rfm$DATE, format = "%m/%d/%y") 
calib <- subset(rfm, rfm$DATE<"1997-09-29") 
valid <- subset(rfm, rfm$DATE>"1997-09-30") 

#Aggregate for frequency, monetary, and recency -- Calibration 
recency<- aggregate(DATE ~ ID, data =calib, FUN = max) 
colnames(recency) <- c("ID","Recency") 
frequency <- aggregate(DOLLARS ~ ID, data =calib, FUN = length) 
colnames(frequency) <- c("ID","Frequency") 
monetary <- aggregate(DOLLARS ~ ID, data =calib, FUN = mean) 
colnames(frequency) <- c("ID","Monetary") 
calib <- merge(frequency, monetary, by = "ID") 
calib <- merge(calib, recency, by = "ID") 

#Aggregate for frequency, monetary, and recency -- Validation 
recency<- aggregate(DATE ~ ID, data =valid, FUN = max) 
colnames(recency) <- c("ID","Recency") 
frequency <- aggregate(DOLLARS ~ ID, data =valid, FUN = length) 
colnames(frequency) <- c("ID","Frequency") 
monetary <- aggregate(DOLLARS ~ ID, data =valid, FUN = mean) 
colnames(frequency) <- c("ID","Monetary") 
valid <- merge(frequency, monetary, by = "ID") 
valid <- merge(valid, recency, by = "ID") 

colnames(valid) <- c("ID","FREQ","MONETARY","RECENCY") 
colnames(calib) <- c("ID","FREQ","MONETARY","RECENCY") 
calib$RECENCY <- NULL 

#Create recency score 
#For validation 
for (i in 1:nrow(valid)) { 
    valid$RECENCY1[i] = as.numeric(max(valid$RECENCY) - valid$RECENCY[i]) 
} 
valid$RECENCY <- valid$RECENCY1 
valid$RECENCY1 <- NULL 

#For calibration 
for (i in 1:nrow(calib)) { 
    calib$RECENCY1[i] = as.numeric(max(valid$RECENCY) - calib$RECENCY[i]) 
} 
calib$RECENCY <- calib$RECENCY1 
calib$RECENCY1 <- NULL 

#Merge datasets 
rfm <- merge(calib,valid, by="ID", all.x = TRUE) 

#Create Column for retention% 
require(dplyr) 
rfm$monetary.ntile <- ntile(rfm$MONETARY.y,10) 
rfm$freq.ntile <- ntile(rfm$FREQ.y,10) 
rfm$recency.ntile <- ntile(rfm$RECENCY,10) 
+0

Nathan-Luke, willkommen zu Stackoverflow. Um es einfacher zu machen, lies bitte (1) [wie stelle ich eine gute Frage] (http://stackoverflow.com/help/how-to-ask), (2) [Wie erstelle ich einen MCVE] (http://stackoverflow.com/help/mcve) sowie (3) [wie man ein minimales reproduzierbares Beispiel in R zur Verfügung stellt] (http://stackoverflow.com/questions/5963269/how-to-make-a- groß-r-reproduzierbar-Beispiel # antwort-5963610). Dann schlage ich vor, dass Sie Ihre Frage entsprechend bearbeiten und verbessern. Das heißt, stellen einige künstliche Eingabedaten bereit (viele Leser wissen nichts über CDNow-Daten) und vielleicht die erwartete Ausgabe. – lukeA

Antwort

0

Zum Beispiel, wenn Sie 10 Eimer wollen für Aktualität, Häufigkeit und Währungsverhältnis:

set.seed(1) 
n <- 100 
df <- data.frame(
    R = runif(n, 1, 365), 
    F = runif(n, 1, 5), 
    M = runif(n, 0, 100) 
) 
apply(df, 2, function(col) { 
    breaks <- quantile(col, probs=seq(0, 1, length.out = 10)) 
    findInterval(col, breaks) 
})