Modérateur : Groupe des modérateurs
Brice ASSOUAKON a écrit :Mon problème est que je veux ramener la colonne ID au niveau de la base PAIEMENT de sorte que tant que Contrat de PAIEMENT est A et que la somme des prime de PAIEMENT pour CONTRAT=A ne vaut pas Estimation de la ligne 1 de la base AVANCE c'est à dire la première valeur de l'estimation de la base AVANCE pour CONTRAT=A j'affecte à tous les paiement de Contrat=A ID de la ligne 1 de la base avance si le cumule des primes atteint la valeur de l'estimation pour CONTRAT=A j'affecte à la ligne suivante l'ID de la deuxieme ligne de CONTRAT=A de la base AVANCE
Brice ASSOUAKON a écrit :Bonjour Messieurs,
[..]
Code : Tout sélectionner
AVANCES <- data.frame(ID=1:6,
Contrat=c("A", "A", "B", "B", "C", "C"),
Estimation=c(400, 500, 600, 800, 1000, 1500),
stringsAsFactors = FALSE)
PAIEMENT <- data.frame(Contrat=c(rep("A", 6), rep("B", 5)),
prime=c(rep(100, 6), rep(200, 5)),
stringsAsFactors = FALSE)
id_ref <- list()
for (ctr in unique(PAIEMENT$Contrat)) { #ctr="A"
paie_ctr <- PAIEMENT$prime[PAIEMENT$Contrat==ctr]
seuil_ctr <- AVANCES$Estimation[AVANCES$Contrat==ctr][1]
id1 <- AVANCES$ID[AVANCES$Contrat==ctr][1]
id2 <- AVANCES$ID[AVANCES$Contrat==ctr][2]
cumul_ctr <- 0
id_ref[[ctr]] <- rep(id1, length(paie_ctr))
for (i in 1:length(paie_ctr)) {
cumul_ctr <- cumul_ctr+paie_ctr[i]
if (cumul_ctr>seuil_ctr) {
id_ref[[ctr]][i] <- id2
}
}
}
PAIEMENT_avecID <- cbind(ID=unlist(id_ref), PAIEMENT)
Brice ASSOUAKON a écrit :Merci pour les codes, il marchent. Cependant pouvez-vous m'apporter plus d'explication sur les lignes
des codes car je dois l'appliquer à mon cas ( des base de près de 1 000 000 de lignes). Merci
Code : Tout sélectionner
library(dplyr)
library(tidyr)
contr <- unique(paiement$Contrat)
test <- vector("list", length(contr))
names(test) <- contr
for (i in contr) {
l1 <- which(avance$Contrat == i)
auxi <- findInterval(paiement2$prime2[paiement$Contrat == i]-1e-3, avance$Estimation[l1], rightmost.closed= TRUE)+1
test[[i]] <- avance$ID[l1][auxi]
}
paiement$ID <- unlist(test)
paiement <- paiement %>% fill(ID)
Code : Tout sélectionner
brice_df <- data.frame(
Contrat = rep(names(brice), lengths(brice)),
ID = unlist(brice, use.names = FALSE),
stringsAsFactors = FALSE
)
Retourner vers « Questions en cours »
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité