5

現在、私のRループ(以下を参照)は、各反復中にそれ自体を上書きします。各ループの結果をテキストファイルに出力したいと思います。

詳細:R初心者は、各ファイルの平均値がテキストファイルに書き込まれるように、スクリプトに行を含める方法を考えています。スクリプトが新しい空のテキストファイルを作成し、スクリプトがファイルの列4の平均を計算するたびに、その値が列1のファイルの名前との平均値を含むテキストファイルの行に出力されるようにします。列2。ご協力いただきありがとうございます。

filename <- system("ls /dir/",intern=TRUE)

for(i in 1:length(filename)){

file <- read.table(filename[i],header=FALSE) ## if you have headers in your files ##
mean <- mean(as.numeric(file$V4))



}
4

2 に答える 2

6

ループの実行中にそれを行うには、ループに次を追加します。

write.csv(data.frame(fname=filename[i],mean=mean),file="output.csv",append=TRUE)

ただし、これは多くのファイル システム オーバーヘッドを意味し、R でデータ フレーム全体を生成してからファイル全体を書き込む方が高速です。したがって、ループの代わりに次のように記述します。

means <- sapply(filename, function(x) mean(as.numeric(read.table(x,header=FALSE)$V4)))

そして、ファイル全体を次のように書き込みます。

write.csv(data.frame(fname=filename,mean=means),file="output.csv")
于 2012-07-02T11:51:38.513 に答える
4

次のスクリプトは、最初に列名のみでファイルを作成し、次に各結果を追加することによってそれを行います。

filename <- system("ls /dir/",intern=TRUE)

column_names <- data.frame(filename = "filename", mean = "mean")
write.table(column_names, file = "output.csv", row.names = FALSE, 
            append = FALSE, col.names = FALSE, sep = ", ", quote = TRUE)

for(i in 1:length(filename)){
  file <- read.table(filename[i],header=FALSE)
  newline <- data.frame(t(c(filename[i], mean(as.numeric(file$V4)))))
  write.table(newline, file = "output.csv", row.names = FALSE, 
              append = TRUE, col.names = FALSE, sep = ", ")
}

ただし、各ステップでのファイルへの書き込みはあまり効率的ではなく、最後にのみ行うことを検討してください。

filename <- system("ls /dir/",intern=TRUE)

results <- data.frame(filename = "filename", mean = "mean")

for(i in 1:length(filename)){
  file <- read.table(filename[i],header=FALSE)
  newline <- data.frame(t(c(filename = filename[i], mean = mean(as.numeric(file$V4)))))
  results <- rbind(results, newline)
}
write.table(results, file = "output.csv", row.names = FALSE, 
            append = FALSE, col.names = TRUE, sep = ", ")
于 2012-07-02T12:21:37.037 に答える