Автоматизируйте анализ нескольких файлов .txt

У меня есть много копий двух типов (a + b) txt файла, т.е.:

a1.txt a2.txt a3.txt... and b1.txt b2.txt b3.txt

Моя цель - запустить скрипт r, который делает следующее:

read.table a1.txt
#run a bunch of code that chops and changes the data and then stores some vectors and data      frames.
w<-results
x<-results
detach a1.txt
read.table b1 .txt 
#run a bunch of code that chops and changes the data and then stores some vectors and data frames.
y<-results
z<-results
model1<-lm(w~y)
model2<-lm(x~z)

Каждый раз, когда я хочу извлечь коэффициенты, например, из 1 наклон для модели1 и 2 наклона от модели2. Я хочу запустить этот анализ автоматически для всех пар текстовых файлов a и b и построить коэффициенты в векторном формате в одном другом файле. для последующего анализа.

До сих пор мне удавалось получать информацию только из более простых анализов вот так. У кого-нибудь есть лучшая идея о том, как запустить эту более сложную итерацию со многими файлами?

РЕДАКТИРОВАТЬ: пытался до сих пор, но пока не удалось:

your<-function(x) 
{
files <- list.files(pattern=paste('.', x, '\\.txt', sep=''))
a <- read.table(files[1],header=FALSE)
attach(a)
w <- V1-V2
detach(a)
b <- read.table(files[2],header=FALSE)
z <- V1-V2
model <- lm(w~z)
detach(b)
return(model$coefficients[2])
}

slopes <- lapply(1:2, your)
Error in your(1) : object 'V1' not found

person user1322296    schedule 12.04.2012    source источник
comment
2 вещи. Во-первых, лучше избегать использования attach и detach. Во-вторых, (его можно было бы избежать, обратившись к первому!) после того, как вы прочитали b, вы не attach его. Вместо этого используйте что-то вроде z <- b$V1 - b$V2.   -  person Justin    schedule 13.04.2012
comment
Я только что сломал это, прежде чем ты вернулся ко мне. Большое спасибо!   -  person user1322296    schedule 13.04.2012


Ответы (1)


Вы можете сделать что-то вроде:

files <- list.files(pattern='.1\\.txt') # get a1.txt and b1.txt

если вы знаете, сколько файлов у вас есть (скажем, 10), вы должны обернуть свой код выше в функцию и использовать один из семейства apply в зависимости от желаемого результата:

your.function(x) {
  files <- list.files(pattern=paste('.', x, '\\.txt', sep=''))
  a <- read.table(files[1])
  b <- read.table(files[2])

  w <- ...
  x <- ...

  y <- ...
  z <- ...

  model1 <- lm(w~y)
  model2 <- lm(x~z)

  return(c(model1$coefficients[2], moedl2$coefficients[2]))
}

slopes <- lapply(1:10, your.function)
person Justin    schedule 12.04.2012
comment
Привет Джастин, спасибо за ваш ответ, не могли бы вы пояснить раздел list.files(pattern=paste('.', x, '\\.txt', sep='')), я не знаю, что принимают аргументы ('.', x, '\\.txt', sep='') - person user1322296; 13.04.2012
comment
paste принимает произвольное количество аргументов и объединяет их вместе с указанным разделителем (sep='' не дает разделителя). например paste('foo', 'bar', sep=' ') против paste('foo', 'bar', sep='!'). Это помогает? Я просто смешиваю индекс (число от 1 до 10) с регулярным выражением, которое соответствует одному символу (a или b) плюс number.txt (поэтому он должен найти a1.txt и b1.txt, если x=1). Ясно, как грязь, я уверен! - person Justin; 13.04.2012