5

目前我的 R 循环(见下文)在每次迭代期间都会覆盖自身。我想将每个循环的结果输出到一个文本文件中。

更详细:R初学者在这里想知道如何在我的脚本中包含一行,以便将每个文件的平均值计算写入文本文件。这样脚本会创建一个新的空文本文件,然后每次脚本计算文件中第 4 列的平均值时,该值都会输出到文本文件中的一行,该行包含第 1 列中的文件名和第 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 回答