2012-07-02 3 views
1

Я использую R для расчета средних значений столбца в файле так:Перебор файлов в R

R 
file1 = read.table("x01") 
mean(file1$V4) 

Однако у меня нет опыта строительных циклов, связанных с R, только с Баш. Как бы преобразовать это в цикл, который сделал это для каждого файла в папке, и сохранил вывод в один файл с именем файла и средним значением в качестве двух столбцов для каждой строки? например:

x01(or file1 if that is simpler) 23.4 
x02 25.4 
x03 10.4 

и т.д.

(Не возражаете, если решение Баш и R или только R) Большое спасибо за вашу помощь!

Текущая ошибка одного из решений с использованием Баш и R:

Error in `[.data.frame`(read.table("PercentWindowConservedRanked_Lowest_cleanfor1000genomes_1000regions_x013", : 
    undefined columns selected 
Calls: mean -> [ -> [.data.frame 
Execution halted 

ответ

2

Мое решение также похож на @jmsinger, но вы можете указать путь к файлам в самом коде, а затем вычислить среднее, как это:

filename <- system("ls /dir/",intern=TRUE) 

for(i in 1:length(filename)){ 

file <- read.table(filename[i],header=TRUE) ## if you have headers in your files ## 
mean <- mean(file$V4) 

write.table(mean,file=paste("/dir",paste("mean",filename[i],sep="."),sep="/")) 
##if you wish to write the means of all the files in seperate files rather than one. 
} 

надеюсь, что это помогает

+0

выглядит неплохо, но бросает ошибку: синтаксическая ошибка возле неожиданного токена '('от первой строки – user964689

+0

I th чернила по первой строке u означали: filename <- system ("ls /dir/",intern=TRUE).I пробовал и работал нормально. – user1021713

+0

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

3

Предполагая, что столбцы всегда одинаковые имена, вы можете сделать следующее: R:

out.file <- 'means.txt' 
for (i in list.files()) { 
    tmp.file <- read.table(i, header=TRUE) # Not sure if you have headers or not 
    tmp.mean <- mean(tmp.file1$V4) 
    write(paste0(i, "," tmp.mean), out.file, append=TRUE) 
} 

Или же вещь с большим количеством bash:

for i in $(ls *) 
do 
    mean=$(Rscript -e "mean(read.table('$i', header=T)[, 'V4'])") 
    echo $i,$mean >> means.txt 
done 
+0

Спасибо , это имеет смысл для меня, хотя он вызывает ошибку: неожиданно '}' in "}" – user964689

+0

Я считаю, что я пропустил ')', он должен быть исправлен. – johannes

+0

hmm все еще бросает ошибку. Более тяжелый сценарий bash, выполняемый по исполнению, останавливается по мере выбора неопределенных столбцов. Ive поставил полную ошибку в моем вопросе – user964689

4

Это похоже на то, что сделал @jmsigner, но с незначительными изменениями , Например, запись в файл выполняется в конце. Код не был протестирован.

out <- lapply(list.files(), FUN = function(x) { 
    m <- mean(read.table(x, header = TRUE)$V4) 
    return(m) 
    }) 
result <- do.call("cbind", out) #merge a list column-wise 
# before writing, you can make column names pretty with colnames() 
# e.g. colnames(result) <- c("x01", "x02") 
write.table(result, file = "means.txt") 
+0

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

+0

@RichieCotton Я хотел дать общее представление о том, как использовать lapply Разумеется, можно или нужно настроить функцию в соответствии с его или ее потребностями. –

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