【问题标题】:How to read text files based on their names?如何根据名称读取文本文件?
【发布时间】:2015-02-23 09:22:22
【问题描述】:

我在一个文件夹fm 中有文本文件,该文件夹对每个站点都有三个不同名称的测量值,但它们共享站点名称。名称的结构相似。我有另一个文件夹st,其中文件名的结构不同,但文件名中包含站点名称。我想在fm 中绘制三个测量值,并在sm 中绘制相应的文件(站点名称)。

我可以将所有文件读取为:

   wgl= read.table("C:\\Users\\wg_ave.txt", sep ='' , header =TRUE)

我可以很容易地手动执行此操作,但由于我有多个文件,我想编写一个函数来读取相应的文件并对文件夹中的所有文件执行此操作。

  First step:Search in folder `fm`files with the same site name
  Wgl: l_name of the site
  Wgk: k_name of the site
  Wger: er_name of the site

阅读它们:

      Wgl= read.table("C:\\Users\\wg_ave.txt", sep ='' , header =TRUE)
       etc….

在文件夹sm中搜索该站点的名称并阅读它

wgsitu= read.table("C:\\Users\\wlkave.txt", sep ='' , header =TRUE)

进行计算、绘图等

        cor(Wgl$va,wgsitu$fg)
        cor(Wgk$va,wgsitu$fg)
        cor(Wger$va,wgsitu$fg)

循环其他网站

感谢您的帮助

【问题讨论】:

    标签: r text


    【解决方案1】:

    你可以这样做:(非常原始的代码)

    files <- list.files("path-to-folder/fm", pattern = "Your File-Pattern", full.names = TRUE)
    

    版本 A:
    如果站点名称保存在文件的列中:

    Wgl <- lapply(files, read.table, sep = '', header = TRUE)
    

    然后你提取站点名称

    site_names <- sapply(Wgl, function(x) {x$sitename_column})
    

    (假设所有文件都具有包含站点名称的同一列)

    版本 B:
    如果站点名称是文件名的一部分 files

    site_names <- gsub("pattern of pre and suffixes", files)
    

    读取数据
    正如版本 A 中所做的那样

    site_file_names <- list.files("path-to-folder/sm", pattern = paste0(site_names, collapse = "|"), full.names = TRUE)
    dat <- lapply(files, read.table, sep = '', header = TRUE)
    

    【讨论】:

    • 这使得它变得更加容易,因为您只需使用 site_names &lt;- gsub("pattern of pre and suffixes", files) Habe 之类的文件从文件中提取站点名称,看看 ?gsub 是如何工作的
    【解决方案2】:

    网站名称的循环可能更容易:

            #set your directory
            setwd("C:\\Users\\fm")
    
            #you get the list of files in the directory
            lista<-list.files() 
    
            #example (don't run)
            #lista<-c("l_new","k_new","er_new","l_old","k_old","er_old")
    
            # I want a loop for each site. Suppose we have 2 sites old and new
            my_site<-c("new","old")
    
    
            for (i in 1:length(mysite)) {
    
            setwd("C:\\Users\\fm")
            #get the 3 files of i site
            files<-grep(my_site[i],lista,fixed=TRUE, value=TRUE)
    
            Wgl<- read.table(paste("C:\\Users\\fm\\","l_",my_site[i],".txt",sep="")    , sep ='' , header =TRUE)
            Wgk<-read.table(paste("C:\\Users\\fm\\","k_",my_site[i],".txt",sep="")    , sep ='' , header =TRUE)
            Wger<-read.table(paste("C:\\Users\\fm\\","er_",my_site[i],".txt",sep="")   , sep ='' , header =TRUE)
    
              setwd("C:\\Users\\st")
             Wgl_file<-grep(wgl,list.files(),fixed=TRUE, value=TRUE)
             Wgl_site<-read.table(paste("C:\\Users\\st\\",Wgl_file,sep="")  , sep ='' , header =TRUE)
    
            Wgk_file<-grep(Wgk,list.files(),fixed=TRUE, value=TRUE)
             Wgk_site<-read.table(paste("C:\\Users\\st\\",Wgk_file,sep="")  , sep ='' , header =TRUE)
    
            Wger_file<-grep(Wger,list.files(),fixed=TRUE, value=TRUE)
             Wger_site<-read.table(paste("C:\\Users\\st\\", Wger_file,sep="")  , sep ='' , header =TRUE)
    
    [...]
            }
    

    【讨论】:

    • 我不明白你问题的这一步。我试图编辑我的答案
    • 也许我更了解阅读您对 Floo0 答案的评论。我又编辑了!
    • 所以最后一步可能只是:setwd("C:\\Users\\st"); st_file&lt;-grep(my_site[i],list.files(),fixed=TRUE, value=TRUE); st_site&lt;-read.table(paste("C:\\Users\\st\\",st_file,sep="") , sep ='' , header =TRUE);?
    • files 用于检查 gre 是否运行良好。如果它返回 character(0) something 是错误的。 my_site[i] 是网站名称吗? list.files() 给你感兴趣的文件? getwd() 是修正后的目录吗?
    猜你喜欢
    • 2016-07-19
    • 2017-09-03
    • 2014-10-07
    • 2017-10-02
    • 2022-01-04
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多