Search code examples
rtidyverserscript

How can I run a script on multiple folders


I developed a script to do operations and graphics on temperature and precipitation files and forecasts. I have 3 stations on which I will have to do the same steps, here is a part of the script that changes the name of the station in the text file name and CSV my question is how to run the script on the 3 folders and save each number for each station at the same time

That the script:

I have 3 folders C: /Users/majd/Documents/l C: /Users/majd/Documents/P C: /Users/majd/Documents/V

In the 3 folders I have the 3 files:

For station 3 the sames files

How I can run the script for the 3 folders in the same times and save the figure using ggplot for the 3 stations in the same time

library(ggplot2)
laval <- ggplot(CIP, aes(x=an, y=value, col=variable)) + geom_line()+xlab('Années') +

laval + scale_x_continuous(name="Années", limits=c(1988, 2006)) +
  scale_y_continuous(name="", limits=c(12.5, 17))

ggsave("L.png", width = 11, height = 8)

Solution

  • You could build a function with the script you already made and then apply it to a vector containing the directories where the files are located. Inside the function, the names of the files that are going to be used can be searched as the files that match certain pattern using list.files. Finally, you just have to save the ggplot in the correct directory and name the file with the name of the station. Here is your code with the modifications I made. I commented all the parts where I did not made changes to make it easier to follow. Hope it works!

    #Added two libraries
    library(stringr)
    library(ggplot2)
    
    my_function<-function(dirs)
    {
      #apply the same function for all the entries in the dirs vector
      sapply(dirs, function(workd){
        #Locate the file inside each directory that has "CNRM" and is a txt file
        CNRM_location<-list.files(path = workd, 
                                  pattern = glob2rx("*CNRM*4.5*.txt"),
                                  full.names = T)
        #read that file
        REF_CNRM <- read.table(CNRM_location, header=TRUE,dec=".",sep=" ", encoding="UTF-8")
    
        # summary(REF_CNRM)
        # 
        # colnames(REF_CNRM)[1] <-"date"
        # colnames(REF_CNRM)[4] <-"Tasmin"
        # colnames(REF_CNRM)[5] <-"Tasmax"
        # colnames(REF_CNRM)[6] <-"Pre"
        # colnames(REF_CNRM)[7] <-"Neige"
        # 
        # 
        # REF_CNRM$date <- as.Date(as.character(REF_CNRM$date), format = "%Y%m%d")
        # REF_CNRM$year <- year(ymd(REF_CNRM$date))
        # REF_CNRM$month <- month(ymd(REF_CNRM$date)) 
        # REF_CNRM$day <- day(ymd(REF_CNRM$date))
        # REF_CNRM<- REF_CNRM[,c(8,9,10,1,2,3,4,5,6,7)]
        # REF_CNRM <- REF_CNRM[,-4]
        # 
        # REF_CNRM = subset(REF_CNRM,REF_CNRM$year>1970)
        # REF_CNRM = subset(REF_CNRM,REF_CNRM$year<2006)
        # REF_CNRM = subset(REF_CNRM,REF_CNRM$month>3)
        # REF_CNRM = subset(REF_CNRM,REF_CNRM$month<10)
        # summary(REF_CNRM)
        # #convert to celecius
        # 
        # REF_CNRM$Tasmoy = (REF_CNRM$Tasmin+REF_CNRM$Tasmax)/2
        # Tasmoy <- convert.temperature(from="K", to="C",REF_CNRM$Tasmoy)
        # REF_CNRM <- cbind(REF_CNRM,Tasmoy)
        # REF_CNRM <- REF_CNRM[,-10]
        # CNRM = aggregate(REF_CNRM[,10],FUN=mean,by=list(REF_CNRM$year))
        # 
        # #precipitation moyenne annuelle 
        # 
        # CNRM_Pre = aggregate(REF_CNRM[,8],FUN=mean,by=list(REF_CNRM$year))
    
    
        # DAta IPSL
        #Locate the file inside each directory that has "IPSL" and is a txt file
        IPSL_location<-list.files(path = workd, 
                                  pattern = glob2rx("*IPSL*4.5*.txt"),
                                  full.names = T)
        #read that file
        REF_IPSL <- read.table(IPSL_location,header=TRUE,dec=".",sep=" ")
    
        # summary(REF_IPSL)
        # 
        # colnames(REF_IPSL)[1] <-"date"
        # colnames(REF_IPSL)[4] <-"Tasmin"
        # colnames(REF_IPSL)[5] <-"Tasmax"
        # colnames(REF_IPSL)[6] <-"Pre"
        # #colnames(REF_IPSL)[7] <-"Neige"
        # 
        # #Date 
        # REF_IPSL$date <- as.Date(as.character(REF_IPSL$date), format = "%Y%m%d")
        # REF_IPSL$year <- year(ymd(REF_IPSL$date))
        # REF_IPSL$month <- month(ymd(REF_IPSL$date)) 
        # REF_IPSL$day <- day(ymd(REF_IPSL$date))
        # REF_IPSL<- REF_IPSL[,c(7,8,9,1,2,3,4,5,6)]
        # REF_IPSL <- REF_IPSL[,-4]
        # 
        # REF_IPSL = subset(REF_IPSL,REF_IPSL$year>1970)
        # REF_IPSL = subset(REF_IPSL,REF_IPSL$year<2006)
        # REF_IPSL = subset(REF_IPSL,REF_IPSL$month>3)
        # REF_IPSL= subset(REF_IPSL,REF_IPSL$month<10)
        # summary(REF_IPSL)
        # #convert to celecius
        # REF_IPSL$Tasmoy=(REF_IPSL$Tasmin+REF_IPSL$Tasmax)/2
        # Tasmoy <- convert.temperature(from="K", to="C",REF_IPSL$Tasmoy)
        # REF_IPSL <- cbind(REF_IPSL,Tasmoy)
        # REF_IPSL <- REF_CNRM[,-9]
        # IPSL = aggregate(REF_IPSL[,9],FUN=mean,by=list(REF_IPSL$year))
        # 
        # #precipitation moyenne annuelle IPSL
        # IPSL_Pre = aggregate(REF_IPSL[,8],FUN=mean,by=list(REF_IPSL$year))
    
    
        # Données d'observations Laval
        #Locate the file inside each directory that is a csv
        Station_location<-list.files(path = workd, 
                                     pattern = glob2rx("*.csv"),
                                     full.names = T)
        #Read the file
        obs <- read.table(Station_location,header=TRUE,sep=";",dec=",", skip=3)
    
        #This is for extracting the name of the station, so you can save the plot with
        #that name
        Station_name<-list.files(path = workd, 
                                 pattern = glob2rx("*.csv"),
                                 full.names = F)
        #Remove the ".csv" part and stay only with the Station name
        Station_name <- strsplit(Station_name,".csv")[[1]][1]
    
        # summary(obs)
        # colnames(obs)[2] <-"an"
        # colnames(obs)[3] <-"mois"
        # colnames(obs)[5] <-"Tasmax"
        # colnames(obs)[6] <-"Tasmin"
        # colnames(obs)[7] <-"Tasmoy"
        # colnames(obs)[8] <-"Pre"
        # summary(obs)
        # obs = subset(obs,obs$an>1970)
        # obs = subset(obs,obs$an<2006)
        # obs = subset(obs,obs$mois>3)
        # obs = subset(obs,obs$mois<11)
        # summary(obs)
        # OBS = aggregate(obs[,7],FUN=mean,by=list(obs$an))
        # 
        # #precipitation mean  IPSL
        # 
        # obs_Pre = aggregate(obs[,8],FUN=mean,by=list(obs$an))
        # 
        # 
        # #merge temperature 
        # 
        # CNRM_IPSL = merge(CNRM,IPSL, by="Group.1")
        # CNRM_IPSL_obs=merge(CNRM_IPSL,OBS, by ="Group.1")
        # colnames(CNRM_IPSL_obs)[1] <-"an"
        # colnames(CNRM_IPSL_obs)[2] <-"CNRM"
        # colnames(CNRM_IPSL_obs)[3] <-"IPSL"
    
        #Paste the station name with "OBS_" to rename the column 4
        colnames(CNRM_IPSL_obs)[4] <- paste0("OBS_",Station_name)
    
        # CNRMIPSL <- reshape2::melt(CNRM_IPSL_obs, id.var='an')
        # library(ggplot2)
        # laval <- ggplot(CNRMIPSL, aes(x=an, y=value, col=variable)) + geom_line()+xlab('Années') +
        #   ylab('Température Moyenne (°C)') 
        # laval + scale_x_continuous(name="Années", limits=c(1988, 2006)) +
        #   scale_y_continuous(name="Température Moyenne (°C)", limits=c(12.5, 17))
    
        #Finally save the plot to the directory using the station name
        ggsave(paste0(workd,"/",Station_name,"_CNRM_IPSL.png"), width = 11, height = 8)
      })
    
    }
    
    #Set the directories where you want to apply your function
    station_directories<-c("C:/Users/majd/Documents/laval",
                           "C:/Users/majd/Documents/Paris",
                           "C:/Users/majd/Documents/Toulouse")
    
    #Apply your function
    my_function(station_directories)