1

我正在使用 R 来计算文件中列的平均值,如下所示:

R
file1 = read.table("x01")
mean(file1$V4)

但是,我没有构建涉及 R 的循环的经验,只能使用 bash。我如何将其转换为一个循环,对文件夹中的每个文件执行此操作,并将输出保存到一个文件中,文件名和平均值作为每行的 2 列?例如:

x01(or file1 if that is simpler) 23.4
x02 25.4
x03 10.4

ETC

(不介意解决方案是 bash 和 R 还是专门的 R)非常感谢您的帮助!

使用 bash 和 R 的解决方案之一的当前错误:

Error in `[.data.frame`(read.table("PercentWindowConservedRanked_Lowest_cleanfor1000genomes_1000regions_x013",  : 
  undefined columns selected
Calls: mean -> [ -> [.data.frame
Execution halted
4

3 回答 3

4

这与@jmsigner 所做的类似,但有细微的变化。例如,写入文件是在最后完成的。该代码尚未经过测试。

out <- lapply(list.files(), FUN = function(x) {
    m <- mean(read.table(x, header = TRUE)$V4)
    return(m)
  })
result <- do.call("cbind", out) #merge a list column-wise
# before writing, you can make column names pretty with colnames()
# e.g. colnames(result) <- c("x01", "x02")
write.table(result, file = "means.txt")
于 2012-07-02T08:30:11.660 回答
3

假设列的名称始终相同,您可以在 R 中执行以下操作:

out.file <- 'means.txt'
for (i in list.files()) {
    tmp.file <- read.table(i, header=TRUE)  # Not sure if you have headers or not
    tmp.mean <- mean(tmp.file1$V4)
    write(paste0(i, "," tmp.mean), out.file, append=TRUE)
}

或者用更多的 bash 做同样的事情:

for i in $(ls *)
do
  mean=$(Rscript -e "mean(read.table('$i', header=T)[, 'V4'])")
  echo $i,$mean >> means.txt
done
于 2012-07-02T08:04:54.773 回答
2

我的解决方案也类似于@jmsinger,但您可以在代码本身中指定文件的路径,然后像这样计算平均值:

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

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

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

write.table(mean,file=paste("/dir",paste("mean",filename[i],sep="."),sep="/")) 
##if you wish to write the means of all the files in seperate files rather than one.
}

希望这可以帮助

于 2012-07-02T08:41:58.937 回答