2012-04-14 49 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" 

编辑:你应该包括^为好,如沃伊切赫建议。 ^匹配行的开头,或者在您的情况下匹配文件名的开头。