【问题标题】:How can I run a script on multiple folders如何在多个文件夹上运行脚本
【发布时间】:2020-05-08 01:33:31
【问题描述】:

我开发了一个脚本来对温度和降水文件和预报进行操作和绘图。我有 3 个站,我必须执行相同的步骤,这是脚本的一部分,它在文本文件名和 CSV 中更改站的名称我的问题是如何在 3 个文件夹上运行脚本并保存同一时间每个站的每个号码

那个脚本:

我有 3 个文件夹 C: /Users/majd/Documents/l C:/用户/majd/文档/P C: /Users/majd/Documents/V

在 3 个文件夹中,我有 3 个文件:

对于第 3 站,相同的文件

如何同时运行 3 个文件夹的脚本并使用 ggplot 同时为 3 个站点保存图形

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)

【问题讨论】:

    标签: r tidyverse rscript


    【解决方案1】:

    您可以使用您已经制作的脚本构建一个函数,然后将其应用于包含文件所在目录的向量。在函数内部,可以使用list.files 搜索将要使用的文件名作为匹配特定模式的文件。最后,您只需将 ggplot 保存在正确的目录中,并用站名命名文件。这是您的代码以及我所做的修改。我评论了我没有进行更改的所有部分,以使其更容易理解。希望它有效!

    #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)
    

    【讨论】:

    • 感谢您的回答,如果我需要添加 forlders 目录,我只有一个问题?再次感谢您,我将根据您的修改尝试脚本
    • 感谢您的回答,如果我需要添加 forlders 目录,我只有一个问题?再次感谢您,我将根据您的修改尝试脚本
    • 您只需要指定三个站的文件所在的目录,然后将函数应用于该向量。该函数应在每个文件夹(CNRM、IPSL 和 Station)中找到对应的 3 个文件,并将每个 Station 的图保存在其对应的文件夹中。
    • read.table 函数似乎无法读取文件。检查您的文件夹位置是否正确。您也可以尝试使用debug(my_function),然后运行my_function(station_directories) 来查看错误在哪里。如果您发布一些数据,我会更容易提供帮助。路径是在向量station_directories中指定的,所以不需要在其他地方指定。
    • 您可以搜索这些文件并使用我在原始帖子中使用的相同方法加载它们:CNRM_location8.5&lt;-list.files(path = workd, pattern = glob2rx("*CNRM*8.5*.txt"), full.names = T) #read that file REF_CNRM8.5 &lt;- read.table(CNRM_location8.5, header=TRUE,dec=".",sep=" ", encoding="UTF-8")
    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2014-06-11
    • 2021-08-27
    • 2015-09-03
    相关资源
    最近更新 更多