我写了一个循环来找出哪个客户是新客户。代码是这样的:
#Format dates
emision <- as.POSIXct(modelerData$Fecha_Emision_Poliza, format= "%Y-%m-%d", tz="UTC")
anulacion <- as.POSIXct(modelerData$Fecha_Anulacion, format= "%Y-%m-%d", tz="UTC")
#Todo a TRUE
modelerData$Nuevos_Clientes[1] <- "T"
#La primera póliza a TRUE las demás a False
for (t in 2:nrow(modelerData)) {
modelerData$Nuevos_Clientes[t] <- "T"
if (modelerData$Cod_Titular_Poliza[t]==modelerData$Cod_Titular_Poliza[t-1]){
modelerData$Nuevos_Clientes[t] <- "F"
}
}
#Define vector for indexes
vec <- vector(length = nrow(modelerData))
vec <- which(modelerData$Nuevos_Clientes == "T")
vec[length(vec)+1] <- nrow(modelerData)+1
#Create function for max annulations `anteriores`
max_anula <- function( q, w) {
voc <- vector(length = q-w)
for (m in w:(q-1)) {
voc[m-w+1]<- anulacion[m]
}
maxi <- max(voc, na.rm = TRUE)
return(maxi)
}
#Recorre las pólizas
s <- 1
for (h in vec){
s <- s+1
if(h==max(vec) | s == length(vec)+1){
break
}
else if (vec[s]-vec[s-1]==1){
next}
else {
for (i in (h+1):(vec[s]-1)){
print(cat("Esta es i: ",i,"\n"))
print(cat("Esta es s: ",s,"\n"))
print(cat("Esta es h: ",h,"\n"))
if(emision[i]==emision[i-1]){
modelerData$Nuevos_Clientes[i]<-modelerData$Nuevos_Clientes[i-1]
}
else if (is.na(anulacion[i-1]==TRUE)){
for (n in i:(vec[s]-1)) {
modelerData$Nuevos_Clientes[i]<- "F" #Como hay una arriba "Activa" todos los de abajo "F"
#rompe el bucle ya no tengo que mirar más pólizas
}
break
} else if (emision[i]<anulacion[i-1]){
modelerData$Nuevos_Clientes[i]<- "F"
}
else if (as.numeric(emision[i])< max_anula(i-1, h)){ #(emision[i]< max(anulacion_anteriores, na.rm = TRUE))){
modelerData$Nuevos_Clientes[i]<- "F"
}
else
modelerData$Nuevos_Clientes[i]<- "T"
}
}
}
#Creamos la nueva columna
modelerData$Nuevos_Clientes <- Nuevos_Clientes
newVar <- c(fieldName="Nuevos_Clientes", fieldLabel="", fieldStorage="string", fieldMeasure="", fieldFormat="", fieldRole="")
modelerDataModel <- cbind(modelerDataModel, newVar)
数据集样本(Nuevos_Clientes是我正在计算的字段):
Cod_Titular_Poliza Cod_Poliza Fecha_Emision_Poliza Fecha_Anulacion Nuevos_Clientes
99999 41000011063800000 01/03/2003 0:00 31/01/2006 0:00 T
99998 41000011063800000 01/03/2003 0:00 31/10/2006 0:00 T
99997 41000011063800000 01/03/2003 0:00 31/01/2006 0:00 T
99996 41000011063800000 01/03/2003 0:00 31/01/2006 0:00 T
99996 41000011063300000 01/01/2006 0:00 31/12/2006 0:00 F
99996 41000011088800000 01/01/2014 0:00 T
如果我只是将.csv中的100.000行样本导出到R Studio并执行代码,则只需几分钟。但是,如果我在Modeler的R转换节点中运行相同的代码,则将花费数小时。有什么我想念的吗?如果在Modeler中取样10.000行,则将花费53秒。为什么要运行100.000行需要几个小时?大约需要530秒吗?
感谢您的帮助。