首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多个文件夹上运行脚本

如何在多个文件夹上运行脚本
EN

Stack Overflow用户
提问于 2020-01-22 06:58:28
回答 1查看 98关注 0票数 1

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

脚本:

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

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

对于站点3,相同的文件

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

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-22 12:45:21

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

代码语言:javascript
复制
#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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59850432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档