循环加载文件对

时间:2012-04-14 12:18:42

标签: r

我正在编写一个循环,每次运行需要两个文件,例如a0.txt和b0.txt。我正在运行100多个文件,这些文件从a0.txt和b0.txt运行到a999.txt和b999.txt。我使用的模式函数是完美的,如果我运行文件a0和b0到a9和b9目录中只有文件对0-9。但是当我在目录中放入更多文件并从'0:10运行时,循环失败并将文件中的向量混淆。我认为这是因为我用的是模式。

 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

2 个答案:

答案 0 :(得分: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"

编辑:您应该包括^,就像Wojciech提出的那样。 ^匹配行的开头,或者在您的情况下匹配文件名的开头。

答案 1 :(得分: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引起的,而不是由于文件名不正确引起的,我真的不知道怎么会发生这种情况,因为我想到了一个数据框({{ 1}} creates)每列总是具有相同的行数。您是否将该错误消息从R中复制粘贴? (我觉得可能会有拼写错误,例如read.table就好了。但我很容易就错了)

此外,q <- tapply(a$V3,b$V2,Fun=length)不会修改as.factor(b$V2),它只会返回代表b$V2的因素:致电b$V2之后as.factor仍然是一个向量。你需要将它分配给某些东西,例如:

b$V2