1

ega0.txtとb0.txtの実行ごとに2つのファイルを取得するループを作成しています。私はこれをa0.txtとb0.txtからa999.txtとb999.txtまで実行する100を超えるファイルで実行しています。私が使用するパターン関数は、ディレクトリ内のファイルペア0〜9のみを使用して、ファイルa0およびb0からa9およびb9を実行する場合に完全に機能します。しかし、ディレクトリにさらにファイルを配置して0:10から実行すると、ループが失敗し、ファイル内のベクトルが混乱します。これは私が使っているパターンのせいだと思います。

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

これは、'.',x,//txt.

したがって、'.'=aファイルx=1が見つかった場合a1a0しかし、私がより多くのファイルを実行するときとの間で混乱するだろうと思いa10ます。a999しかし、とまでのファイルも検索するファイルを検索する適切なループを見つけることができないようですb999

誰かがこれを行うためのより良い方法を手伝うことができますか?以下のコード。

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

検索せずに直接ファイルを取得するのはどうですか。すなわち

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$V2as.factor b$V2

V2.factor <- as.factor(b$V2)
于 2012-04-15T02:16:37.613 に答える
0

2 つのファイルの先頭が常に同じ場合 (例では 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 に答える