【问题标题】:For loop with file names in RFor循环与R中的文件名
【发布时间】:2017-12-04 04:08:00
【问题描述】:

我有一个文件列表,例如:

nE_pT_sbj01_e2_2.csv, nE_pT_sbj02_e2_2.csv, nE_pT_sbj04_e2_2.csv, nE_pT_sbj05_e2_2.csv, nE_pT_sbj09_e2_2.csv, nE_pT_sbj10_e2_2.csv

如您所见,文件名是相同的,只是“sbj”(主题的编号)不连续。

我需要运行一个 for 循环,但我想保留主题的原始编号。这个怎么做? 我假设我需要用保留主题原始编号的东西替换length(file),但不知道该怎么做。

setwd("/path")

file = list.files(pattern="\\.csv$") 
for(i in 1:length(file)){
  data=read.table(file[i],header=TRUE,sep=",",row.names=NULL)
  source("functionE.R")
  Output = paste("e_sbj", i, "_e2.Rdata")
  save.image(Output)
}

上面的代码给了我输出:

e_sbj1_e2.Rdata,e_sbj2_e2.Rdata,e_sbj3_e2.Rdata, e_sbj4_e2.Rdata,e_sbj5_e2.Rdata,e_sbj6_e2.Rdata.

相反,我想获得:

e_sbj01_e2.Rdata,e_sbj02_e2.Rdata,e_sbj04_e2.Rdata, e_sbj05_e2.Rdata,e_sbj09_e2.Rdata,e_sbj10_e2.Rdata.

【问题讨论】:

    标签: r loops filenames


    【解决方案1】:

    删除扩展名“csv”,然后添加“Rdata”,并在循环中使用文件名,例如:

    myFiles <- list.files(pattern = "\\.csv$") 
    
    for(i in myFiles){
      myDf <- read.csv(i)
      outputFile <- paste0(tools::file_path_sans_ext(i), ".Rdata")
      outputFile <- gsub("nE_pT_", "e_", outputFile, fixed = TRUE)
      save(myDf, file = outputFile)
    }
    

    注意:我更改了你的变量名,尽量避免使用函数名作为变量名。

    【讨论】:

      【解决方案2】:

      如果您使用正则表达式和sprintf(或paste0),则无需循环即可轻松完成:

      fls <- c('nE_pT_sbj01_e2_2.csv', 'nE_pT_sbj02_e2_2.csv', 'nE_pT_sbj04_e2_2.csv', 'nE_pT_sbj05_e2_2.csv', 'nE_pT_sbj09_e2_2.csv', 'nE_pT_sbj10_e2_2.csv')
      
      
      sprintf('e_%s_e2.Rdata',regmatches(fls,regexpr('sbj\\d{2}',fls)))
      
      [1] "e_sbj01_e2.Rdata" "e_sbj02_e2.Rdata" "e_sbj04_e2.Rdata" "e_sbj05_e2.Rdata" "e_sbj09_e2.Rdata" "e_sbj10_e2.Rdata"
      

      您可以轻松地将向量提供给函数(如果可能)或使用sapplylapply 将函数提供给向量

      fls_new <- sprintf('e_%s_e2.Rdata',regmatches(fls,regexpr('sbj\\d{2}',fls)))
      
      res <- lapply(fls_new,function(x) yourfunction(x))
      

      【讨论】:

      • 这是因为我需要在循环内使用一个函数。即使使用功能也可以吗? source("functionE.R")
      • 取决于你的函数..如果它不接受向量输入,你可以做一个简单的函数循环或者最好使用sapplylapply
      【解决方案3】:

      如果我理解正确,您只需将扩展名从 .csv 更改为 .Rdata,删除最后一个“_2”并将前缀从“nE_pT”更改为“e”。如果是,这应该有效:

      Output = sub("_2.csv", ".Rdata", sub("nE_pT, "e", file[i]))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多