Optimisation d'un script R

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Pierre Hirach
Messages : 2
Enregistré le : 27 Juil 2021, 14:13

Optimisation d'un script R

Messagepar Pierre Hirach » 28 Juil 2021, 08:25

Hello à tous,

Je suis nouveau sur ce forum est nouvel utilisateur de R. Je débute tout juste et sur le tas ! Pour contextualiser, je suis actuellement en stage et on m'a donné pour mission d'optimiser un script R (je n'ai jamais faitde codage, je suis économiste de formation). Concrètement je dois générer la matrice une fois, l'enregistrer pour de bon et faire tourner le reste du script avec pour base cette matrice. Il faut donc que je casse la boucle. Je patauge complètement depuis le début, j'essaye dans un premier temps de comprendre ce qui a été fait ligne par ligne en tentant de repérer la boucle... Si quelqu'un veux bien venir m'aider avant de perdre espoir d'y parvenir un jour !

Merci pour votre aide :)


rm(list=ls())

#Charger les librairies
#setwd('/Users/spare/OneDrive/Bureau/R/Merits')
library(tidyverse)
library(readr)
library(dplyr)
library(lubridate)
library(magrittr)
library(stringr)
library(tidyr)
library(rlist)
library(readxl)


#Importation des donnÈes


UIC <- read_excel("/home/laurent/Documents/MODUS/Merits_UIC code_NUTS2-NUTS3.xlsx")
POR2016 <- read.csv("/home/laurent/Documents/MODUS/2016/SKDUPD_POR.csv", header=FALSE)
TRAIN2016 <- read_csv("/home/laurent/Documents/MODUS/2016/SKDUPD_TRAIN.csv",
col_names = FALSE, col_types = cols(X11 = col_character()))


UIC <- UIC[,c(1:6)]

#Preparation de la table POR


colnames(POR2016)[1] <- "ID"
colnames(POR2016)[2] <- "Position"
colnames(POR2016)[3] <- "UIC_Code"
colnames(POR2016)[4] <- "Arrival"
colnames(POR2016)[5] <- "Arrival_change_day"
colnames(POR2016)[6] <- "Departure"
colnames(POR2016)[7] <- "Departure_change_day"
colnames(POR2016)[8] <- "Arrival_location"
colnames(POR2016)[9] <- "Departure_location"
colnames(POR2016)[10] <- "Local_fuction"
colnames(POR2016)[11] <- "TFR"
POR2016 <- POR2016[,-c(5:5,8:11,7:7)]

# Fusion des tables UIC et POR
POR2016 <- left_join(POR2016,UIC,by="UIC_Code")


part_datPOR <- POR2016

#Supprimer UIC manquants ou Ègaux ‡ 0
part_datPOR <- part_datPOR %>% filter(!is.na(NUT2))
part_datPOR <- part_datPOR %>% filter(NUT2!=0)

max_ID <- max(part_datPOR$ID)

# Supprimer les trajets intermÈdiaires
Test <- part_datPOR %>%
group_by(ID) %>%
slice(c(which.min(Position), which.max(Position)))

View(Test)

# crÈation de 2 sous bases
Test1 <- filter(Test,Position > 1)
#View(Test1)
Test1 <- Test1[,-c(5:5)]
Test2 <- filter(Test,Position == 1)
colnames(Test2)[3] <- "Code_UIC_Departure"
#View(Test2)
Test2 <- Test2[,-c(2:2, 4:4)]
#View(Test2)

# Fusion des 2 sous bases
POR2016Final <- left_join(Test1,Test2, by ="ID")
#View(POR2016Final)
colnames(POR2016Final)[2] <- "Nb_Arrets"

# Supprimer les NUTS manquants
POR2016Final <- POR2016Final %>% filter(!is.na(NUT2.x))
POR2016Final <- POR2016Final %>% filter(!is.na(NUT2.y))
POR2016Final <- POR2016Final %>% filter(NUT2.x!=0)
POR2016Final <- POR2016Final %>% filter(NUT2.y!=0)
#View(POR2016Final)



# PrÈparation de la table Train

colnames(TRAIN2016)[1] <- "ID"
colnames(TRAIN2016)[2] <- "Service_number"
colnames(TRAIN2016)[3] <- "Service_characteristic"
colnames(TRAIN2016)[4] <- "Pricing_category"
colnames(TRAIN2016)[5] <- "Service_mode"
colnames(TRAIN2016)[6] <- "Service_provider"
colnames(TRAIN2016)[7] <- "Information_provider"
colnames(TRAIN2016)[8] <- "Reservation_compagny"
colnames(TRAIN2016)[9] <- "Beginning_date"
colnames(TRAIN2016)[10] <- "End_date"
colnames(TRAIN2016)[11] <- "Circulation_days"
colnames(TRAIN2016)[12] <- "Equipment"
colnames(TRAIN2016)[13] <- "RFR_number"

max_IDT <- max(TRAIN2016$ID)
max_IDT



part_dat <- TRAIN2016


# Fusion des tables Train et Por
part_dat <- left_join(TRAIN2016,POR2016Final, by = "ID")
part_dat <- part_dat %>% filter(!is.na(NUT2.x))
#View(part_dat)



#part_dat <- slice(part_dat,1:100)
#View(part_dat)


# CrÈation du data frame
df<-data.frame(part_dat)
# Calcul de la longueur du vecteur
df$Nb_day <- nchar(df$Circulation_days)

# Multiplication des lignes par la longueur du vecteur
df <- df[rep(row.names(df), df$Nb_day),]
#View(df)



# Boucle pour : extraire les 1 et 0 et les placer ‡ leur dates respectives puis filter sur circule =1
lw <- list()
for (i in df$ID) {
lw[[i]] <- filter(df,df$ID==i)
lw[[i]]$Day <- seq(from=1, to=lw[[i]]$Nb_day[1])

lw[[i]]$Circule <- substr(lw[[i]]$Circulation_days, lw[[i]]$Day,lw[[i]]$Day)

lw[[i]]$Date <- seq.Date(from=lw[[i]]$Beginning_date[1], to=lw[[i]]$End_date[1], by="day")
lw[[i]] <- filter(lw[[i]],lw[[i]]$Circule==1)

}

Merits2016 <- list.rbind(lw)

# ajouter les jours
Merits2016 <- mutate(Merits2016, Week_day= wday(Merits2016$Date, label = TRUE, abbr = FALSE, locale = Sys.getlocale("LC_TIME")))


Merits2016 <- Merits2016[,-c(11:11)]
View(Merits2016)

write.csv(x = Merits2016, file = "Merits2016S.csv", row.names = FALSE, quote = FALSE)

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: Optimisation d'un script R

Messagepar Mickael Canouil » 28 Juil 2021, 14:54

Bonjour,

pourriez-vous utiliser les balises de code ?

"Do not repeat yourself" et documentez-vous sur magrittr et le "pipe" (%>%).
Le pipe, quand il n'y a en qu'un seul dans une opération, c'est qu'il y en a un de trop.

Code : Tout sélectionner

POR2016Final <- POR2016Final %>% filter(!is.na(NUT2.x))
POR2016Final <- POR2016Final %>% filter(!is.na(NUT2.y))
POR2016Final <- POR2016Final %>% filter(NUT2.x!=0)
POR2016Final <- POR2016Final %>% filter(NUT2.y!=0)

Donne

Code : Tout sélectionner

POR2016Final <- filter(POR2016Final, !is.na(NUT2.x) & !is.na(NUT2.y) & NUT2.!= 0 & NUT2.!= 0)
# or POR2016Final <- filter(POR2016Final, NUT2.x %in% c(0, NA) & NUT2.y %in% c(0, NA))
 


Code : Tout sélectionner

colnames(POR2016)[1] <- "ID"
colnames(POR2016)[2] <- "Position"
colnames(POR2016)[3] <- "UIC_Code"
colnames(POR2016)[4] <- "Arrival"
colnames(POR2016)[5] <- "Arrival_change_day"
colnames(POR2016)[6] <- "Departure"
colnames(POR2016)[7] <- "Departure_change_day"
colnames(POR2016)[8] <- "Arrival_location"
colnames(POR2016)[9] <- "Departure_location"
colnames(POR2016)[10] <- "Local_fuction"
colnames(POR2016)[11] <- "TFR"

Donne

Code : Tout sélectionner

colnames(POR2016) <- c(
  "ID", "Position", "UIC_Code", "Arrival", "Arrival_change_day", "Departure",
  "Departure_change_day", "Arrival_location", "Departure_location", "Local_fuction",
  "TFR"
)


Ceci étant, pour la partie vraiment optimisation de la boucle for, votre code n'étant pas du tout reproductible, je ne vais même pas essayer de coder quelque-chose.
Veuillez fournir un exemple minimal et reproductible de votre code, si vous voulez plus d'aides.

Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron