2015-02-25 3 views
2

У меня много файлов csv, и мне нужно их прочитать и выполнить некоторые операции в переменных. Я использовал цикл «for», но он занимает слишком много времени. Здесь я искал множество ответов, и я знаю, что это будет намного эффективнее, но я не могу это реализовать. Может ли кто-нибудь помочь мне, пожалуйста? Пример из файла:изменение цикла для привязки к нескольким файлам

ID Estimate  SE  avar h2 
683 6.17E-02  1.226  1.11 0.19 
52 -1.77E-02  1.278 1.11 0.19 

У меня есть почти 50 файлов в том же формате, но с разными названиями. Я хочу, чтобы прочитать все файлы, создать переменную с именем rel, которая равна: 1 - (SE^2)/avar. После этого я хочу подмножить данные на основе переменной rel и записать новые файлы. Что я пробовал:

myfiles <- list.files(pattern=".csv") 

    for (j in 1:length(myfiles)) { 
     this_file <- read.csv(myfiles[j], header = T) 
     for (i in this_file) { 
       for (k in 1:dim(this_file)){ 
       this_file["rel"] = 1-((this_file["SE"]*this_file["SE"])/this_file["avar"]) 
       this_file <- subset(this_file, this_file["rel"] >= 0.8*this_file["h2"]) 

     write.csv(this_file, file=this_file) 
    }}} 

Я знаю, что это довольно просто, но я не понимаю. Любая помощь будет очень высоко ценится. Спасибо. Paula.

+0

Пожалуйста, объясните, что вы пытаетесь сделать после прочтения каждого файла csv. – Metrics

+0

Спасибо @Metrics. Я сделал это. – PaulaF

+0

Когда вы говорите, что у них разные имена, вы имеете в виду файлы или столбцы в каждом файле? –

ответ

2

Это должно закрыть вас. Я буду использовать новый вектор имен файлов, чтобы мы не перезаписывали ваши текущие файлы.

myfiles <- list.files(pattern = "\\.csv$") 

## make a vector of new file names 'cat*.csv' where * is 1:length(myfiles) 
newfiles <- sprintf("cat%d.csv", seq_along(myfiles)) 

Map(function(x, y) { 
     df <- read.table(x, header = TRUE) 
     df$rel <- with(df, 1 - (SE^2/avar)) 
     write.table(df[df$rel >= (0.8 * df$h2), ], file = y) 
    }, x = myfiles, y = newfiles) 
+0

Спасибо @RichardScriven. Но когда я запускаю его, я получаю следующее сообщение: $ CGRM.csv NULL – PaulaF

+1

Это результат 'write.csv' при использовании' mapply() '. Посмотрите новые файлы и там должны быть некоторые данные –

+0

Извините. Мои файлы - это dataframe. Но похоже, что он не читает. Благодарю. – PaulaF