2012-04-14 90 views
1

我在寫一個循環,每次運行ega0.txt和b0.txt需要兩個文件。我正在運行這100多個從a0.txt和b0.txt運行到a999.txt和b999.txt的文件。我使用的模式函數工作完美,如果我在目錄中運行文件a0和b0到a9和b9只有文件對0-9。但是當我在目錄中放置更多文件並從'0:10開始運行時,循環失敗並將文件中的向量混淆。我認爲這是thepattern`監守我即使用循環加載文件對

list.files(pattern=paste('.', x, '\\.txt', sep='')) 

這僅查找有'.',x,//txt.

所以,如果'.'=ax=1找到文件a1文件。但我認爲它在a0a10之間混淆,當我運行更多的文件。但我似乎無法找到合適的循環,它將掃描文件,該文件也會查找高達a999b999的文件。

任何人都可以幫助更好的方式來做到這一點?代碼如下。

dostuff <- function(x) 
{ 
files <- list.files(pattern=paste('.', x, '\\.txt', sep='')) 
a <- read.table(files[1],header=FALSE) #file a0.txt 
G <- a$V1-a$V2 
b <- read.table(files[2],header=FALSE) #file b0.txt 
as.factor(b$V2) 
q <- tapply(b$V3,b$V2,Fun=length) 
H <- b$V1-b$V2 
model <- lm(G~H) 
return(model$coefficients[2],q) 
} 

results <- sapply(0:10,dostuff) 
Error in tapply(b$V3, b$V2, FUN = length) : arguments must have same length 
+1

我會使用粘貼('^。',x,'\\。txt $',sep ='')作爲模式。 – 2012-04-14 13:27:32

回答

0

如何直接獲取文件,無需搜索。即

dostuff <- function(x) 
{ 
    a.filename <- paste('a', x, '.txt', sep='') # a<x>.txt 
    b.filename <- paste('b', x, '.txt', sep='') # b<x>.txt 
    a <- read.table(a.filename, header=FALSE) 
    # [...] 
    b <- read.table(b.filename, header=FALSE) 
    # [...] 
} 

但錯誤信息說,問題是通過調用tapply而不是約不正確的文件名什麼引起的,我硬是不知道怎麼會發生,因爲我想到了一個數據幀(其中read.table創建)每列的行數始終相同。你是否從R複製粘貼錯誤信息? (我有一個感覺,有可能是一個錯字,所以它是,例如,q <- tapply(a$V3,b$V2,Fun=length)但我可以很容易地是錯誤的)

此外,as.factor(b$V2)不修改b$V2,它只是返回表示b$V2一個因素:後你叫as.factorb$V2仍然是一個載體。你需要將它分配給某些東西,例如:

V2.factor <- as.factor(b$V2) 
+0

簡單的解決方案似乎爲我工作。我認爲問題在於它會調用錯誤的文件,因此矢量長度不匹配。 – user1320502 2012-04-15 21:41:47

0

如果兩個文件的開頭始終相同(在您的示例中爲a,b);你可以在模式中使用這樣的信息:

x <- 1 
list.files(pattern=paste('[a,b]', x, '\\.txt', sep='')) 
# [1] "a1.txt" "b1.txt" 
x <- 11 
list.files(pattern=paste('[a,b]', x, '\\.txt', sep='')) 
# [1] "a11.txt" "b11.txt" 

編輯:你應該包括^爲好,如沃伊切赫建議。 ^匹配行的開頭,或者在您的情況下匹配文件名的開頭。