2017-02-15 3 views
0

У меня возникла следующая проблема, и пока я не нашел подходящего ответа.Запуск через каталоги и файлы и сохранение файлов в новых директориях с разными именами

I've получили грузы наборов данных, хранящихся во вложенных папках в следующем каталоге:

C:/Users/Desktop/Data Generation 

в подпапки follwing схеме:

/Model 1/Model_1_250skew1mar1 

с возможными изменениями в модели от 1 до 3; а также 250 до 750; перекос от 1 до 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 

Я могу сделать это для одного из моих подкаталогов с 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/NA/и, наконец, использует dir() или list.files() с полными относительными именами для обработки файлов и сохранения их в каталоге wd/NA/each в свой каталог:

# 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

Смежные вопросы