1

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

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

这仅查找具有'.',x,//txt.

因此,如果'.'=ax=1找到了 file a1。但我认为它在运行更多文件时a0和运行时会感到困惑。a10但我似乎找不到合适的循环来搜索那些也查找文件的文件,直到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
4

2 回答 2

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 建议的。^匹配一行的开头,或者在您的情况下匹配文件名的开头。

于 2012-04-14T13:58:10.380 回答
0

如何直接获取文件,无需搜索。IE

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: after you call的因子as.factor b$V2仍然是一个向量。您需要将其分配给某些东西,例如:

V2.factor <- as.factor(b$V2)
于 2012-04-15T02:16:37.613 回答