【问题标题】:Looping thru Directories and Files and saving Files in new directories with different names循环遍历目录和文件并将文件保存在具有不同名称的新目录中
【发布时间】:2017-07-03 21:59:31
【问题描述】:

我遇到了以下问题,到目前为止我还没有找到适用的答案。

我有大量的数据集存储在以下目录的子文件夹中:

C:/Users/Desktop/Data Generation

子文件夹遵循这种模式:

/Model 1/Model_1_250skew1mar1 

模型可能从 1 更改为 3;以及 250 到 750;偏斜 1 到 3; 3 月 1 日至 3 日。

例如:/Model 3/Model_3_750skew2mar2 or /Model 2/Model_2_250skew3mar1

在这些子文件夹中,我得到了我的数据集:M1_1 至 M1_1000 或模型 2 M2_1 至 M2_1000

现在我想获取我的数据集:M1_1 到 M1_1000 并替换缺失值并将这些数据集保存在新目录中,根据我获得它们的位置:

C:/Users/Desktop/Data Generation/   NA   /Model 1/Model_1_250skew1mar1

我可以使用以下代码对我的一个子目录执行此操作:

files_M_neu <- list.files(path="C:/Users/Desktop/Data Generation/Model 1/Model_1_250skew1mar1", 
                       pattern="M1_*[^list].dat", recursive=TRUE, full.names=TRUE)

dir.create("C:/Users/Desktop/Data Generation/NA")
dir.create("C:/Users/Desktop/Data Generation/NA/Model 1")
dir.create("C:/Users/Desktop/Data Generation/NA/Model 1/Model_1_250skew1mar1")

for(i in 1:length(files_M_neu)){
  data <- read.table(files_M_neu[i], header=TRUE)
  fix_missing <- function(x) {
    x[x == 999] <- NA
    x
  }
  data <- fix_missing(data)
  write.table(data, paste("C:/Users/Desktop/Data Generation/NA/Model 1/Model_1_250skew1mar1/data[",i,"].dat"), 
              sep="\t", row.names = FALSE, col.names = FALSE)
  rm(data)
}

我怎样才能使这个过程自动化,这样我就没有上面的代码 54 次了?我想要一种干净的方法:获取我的文件,替换缺失的文件并根据我获取文件的目录保存文件。

正如您可能猜到的那样,我是 R 新手,但我现在尝试了不同的方法,但我没有找到更接近解决方案的方法。

【问题讨论】:

    标签: r loops directory subdirectory


    【解决方案1】:

    这是一种解决方案,它使用list.dirs() 递归读取 wd 下的所有目录,然后在 wd/NA/ 下创建相同的目录树,最后使用带有完整相对名称的dir() 或list.files() 来处理文件并将它们保存在 wd/NA/ 下的每个目录中:

    # set wd to work with relative path ./
    setwd("C:/Users/Desktop/Data Generation/")
    
    # get the list of all directories:
    dirList = NULL
    for (d in list.dirs(path = ".", full.names=TRUE, recursive=TRUE)){
      dirList = rbind(dirList, d)
    }
    
    # create the directories tree in ./NA/ 
    for (d in dirList){
      dir.create(paste0('NA',gsub("\\.", "", d)), recursive = TRUE)
    }
    
    # process files and save with full path to ./NA/
    for (f in dir(path = ".", pattern = '*\\.dat$', full.names=TRUE, recursive=TRUE)){
      data <- read.table(f, header=TRUE)
      data <- fix_missing(data)
      write.table(data, paste0('NA',gsub("\\./", "/", f)), 
                  sep="\t", row.names = FALSE, col.names = FALSE)
      rm(data)
    }
    

    【讨论】:

    • 非常感谢!这对我有很大帮助!
    猜你喜欢
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多