1

R を使用して、次のようにファイル内の列の平均値を計算しています。

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

ただし、R を含むループを構築した経験はなく、bash のみを使用しています。これを、フォルダー内のすべてのファイルに対してこれを実行し、出力をファイル名と平均値を各行の2列として1つのファイルに保存するループに変換するにはどうすればよいですか? 例えば:

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

(解決策が bash と R であるか、R のみであるかは気にしないでください) ご協力いただきありがとうございます。

bash と R を使用したソリューションの 1 つからの現在のエラー:

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 に答える