2017-02-15 67 views
0

從來就得到了下面的問題,至於現在,我沒有找到適用的答案。循環直通目錄和文件,並在新的direcotries以不同的名稱保存文件

從來就得到了存儲在子文件夾在下面的目錄的數據集的負載:

C:/Users/Desktop/Data Generation 

子文件夾被follwing這種模式:

​​

在模型1至3個可能的變化;以及250到750;歪斜1到3;而3月1日至3

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

在這些子文件夾我有我的數據集:M1_1M1_1000或模型2 M2_1M2_1000

現在,我想我的數據集:M1_1M1_1000並替換缺失值,並根據在那裏我得到了他們在新目錄中集保存這些數據:

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

我能爲我的子目錄與follwing代碼的一個做到這一點:

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新手,但我試過不同的東西,現在我沒有看到一個方法來得到任何接近的解決方案......

預先感謝您

回答

0

這裏是它使用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) 
} 
+0

非常感謝您!這幫助我很多! – AndySOWI

相關問題