Comment remplacer une boucle
Bonjour,
je débute sur R et je n'arrive pas résoudre un problème.
J’ai 2 dataframe :
• data : dates et heures d’entrée et de sortie de personne sur un mois
• serie_temps : dates et heures minute par minute sur tous le mois : 2016-12-01 00:00:00 / 2016-12-01 00:01:00 / 2016-12-01 00:02:00 / … / 2016-12-31 23:59:00
Et je cherche à calculer le nombre de personnes présentes par minute et donc rajouter une colonne à serie_temps
J’ai pu écrire ce programme qui marche très bien mais qui est très lent… surement à cause de la boucle mais je n’arrive pas à la remplacer
Code:
1 2 3 4
|
for (i in 1:nrow(serie_temps)){
serie_temps[i,2]<-sum(ifelse(data$dateheure_entree<serie_temps[i,1] & data$dateheure_sortie>serie_temps[i,1], 1, 0))
} |
Auriez-vous une idée ?
Merci +++
Comment remplacer une boucle
Bonjour,
Votre dataframe serie_temps contenant toutes les minutes sur tous le mois : 2016-12-01 00:00:00 / 2016-12-01 00:01:00 / 2016-12-01 00:02:00 / … / 2016-12-31 23:59:00, cela fait beaucoup d'observations et beaucoup d'itérations. Le dataframe data doit contenir beaucoup moins d'observations et il est préférable alors de faire la boucle sur le dataframe data plutôt que serie_temps. Cela réduira le nombre d'itérations et sera beaucoup plus rapide.
Sur un petit exemple pour que ce soit plus concret :
Code:
1 2 3 4 5 6 7 8 9 10 11
| > df1 <- data.frame(id=c(1,2,3,4,5,6),
+ deb=c(1,4,3,1,3,2),
+ fin=c(4,7,4,10,9,3))
> df1
id deb fin
1 1 1 4
2 2 4 7
3 3 3 4
4 4 1 10
5 5 3 9
6 6 2 3 |
Boucle sur df2 (serie_temps) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| > df2 <- data.frame(temps=c(1,2,3,4,5,6,7,8,9,10),count=rep(0,10))
> for (i in 1:nrow(df2)){
+ df2[i,2] <- sum(ifelse(df1$deb<df2[i,1] & df1$fin>df2[i,1], 1, 0))
+ }
> df2
temps count
1 1 0
2 2 2
3 3 2
4 4 2
5 5 3
6 6 3
7 7 2
8 8 2
9 9 1
10 10 0 |
Boucle sur df1 (data) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| > df2 <- data.frame(temps=c(1,2,3,4,5,6,7,8,9,10),count=rep(0,10))
> for (i in 1:nrow(df1)){
+ df2$count <- df2$count + ifelse(df1[i,"deb"]<df2$temps & df1[i,"fin"]>df2$temps, 1, 0)
+ }
> df2
temps count
1 1 0
2 2 2
3 3 2
4 4 2
5 5 3
6 6 3
7 7 2
8 8 2
9 9 1
10 10 0 |
Je vous laisse adapter le programme à vos données et nous indiquer les temps d'exécution. Vous pouvez chronométrer votre programme à l'aide des fonctions Sys.time() et difftime().
Code:
1 2 3 4
| T1<-Sys.time()
# programme
T2<-Sys.time()
difftime(T2, T1) |
Cordialement,