1

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)
Majdolin
  • 13
  • 3

1 Answers1

1

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)
  • thank you for your answers i have juste one question if i need to add directory of forlders or not ? thank you again i will try the script with your modifications – Majdolin Jan 22 '20 at 17:24
  • thank you for your answers i have juste one question if i need to add directory of forlders or not ? thank you again i will try the script with your modifications – Majdolin Jan 22 '20 at 20:38
  • You just need to specify the directories where the files for the three stations are located and then apply the function to that vector. The function should find the corresponding 3 files in each folder (CNRM, IPSL and Station) and save each Station's plot in its corresponding folder. – Jonathan V. Solórzano Jan 22 '20 at 21:10
  • It looks like the files cannot be read by `read.table` function. Check if your folder locations are correct. You could also try using `debug(my_function)` and then running `my_function(station_directories)` to see where the error is. It would be easier for me to help if you post some your data. The path is being specified in the vector `station_directories`, so it is not necessary to specify it in other place. – Jonathan V. Solórzano Jan 22 '20 at 22:30
  • You can search for those files and load them using the same approach I used in the original post: `CNRM_location8.5<-list.files(path = workd, pattern = glob2rx("*CNRM*8.5*.txt"), full.names = T) #read that file REF_CNRM8.5 <- read.table(CNRM_location8.5, header=TRUE,dec=".",sep=" ", encoding="UTF-8")` – Jonathan V. Solórzano Jan 23 '20 at 00:01
  • @ Jonathan V. Solórzano thank you so i need to do other part of code with function like the first – Majdolin Jan 23 '20 at 00:09