- ベストアンサー
列の計算方法とデータ整理について
- perlをはじめて間もない者が、列の計算方法とデータ整理について質問します。データは列で表されており、1列目がヘッダーで、2列目以降は各個体に対する数値が入っています。この数値をある区間ごとに平均する方法を知りたいです。
- また、データが列で表されているため、行列を入れ替える関数などがあるのか知りたいです。データは80列に及ぶ場合もあります。
- 質問者はperl初心者であり、効率的な方法があれば教えてほしいと述べています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ではそれなりに詳しく。。。 ファイルからデータを読み込む。 これはわかるでしょ。 open(IN,$FILE); @data = <IN>; close(IN); 上の五つは邪魔なのでとってしまう。 for で 5回同じことをするってことね。 shift とかのコマンドはどっかで検索してください。 for(1..5){ shift(@data); } ちょっとだけ改良します。 # 数字の始め。 $kokokara = 350; # 数字の終わり。 $kokomade = 400; # $i で何個HITしたか数えます。 $i = 0; # 配列を全て実行する。 foreach $data (@data) { # 中の文字列を半角スペースで配列に入れる (@data2) = split(/ /,$data); # 指定の数字内であれば if(($kokokara <= $data2[0]) and ($data2[0] <= $kokomade)) { # HIT数を一個増やす。 $i++; # 一番目から五番目までの数字を項目ごとに足していく。 # 分かりやすく for は使用しないバージョン。 $all_data[1] += $data2[1]; $all_data[2] += $data2[2]; $all_data[3] += $data2[3]; $all_data[4] += $data2[4]; $all_data[5] += $data2[5]; } } # 計算結果を出す。 print "計算結果 "; # 分かりやすくfor は使わないでやろうかな # 合計した数字をHIT数で割ればよい。 print $all_data[1] / $i ." "; print $all_data[2] / $i ." "; print $all_data[3] / $i ." "; print $all_data[4] / $i ." "; print $all_data[5] / $i ." "; こんな感じ。 実際に動かしてみてやってください。 分からない場合は 関数を検索してみて、どんな動きなのかを見てください。 これ以上分かりやすく説明するのは私にはむりー
その他の回答 (2)
- moon_night
- ベストアンサー率32% (598/1831)
とりあえず全てのデータが配列に入っていると仮定します。 open(IN,$FILE); @data = <IN>; close(IN); 上の五つは邪魔なのでポイします。 for(1..5){ shift(@data); } あとは数えるだけ。 $i = 0; foreach $data (@data) { $i++; (@data2) = split(/ /,$data); for(1..5){ $all_data[$_] += @data2[$_]; } } print "計算結果 "; for(1..5){ print $all_data[$_] / $i; print " "; # これはスペースを入れてるだけ。 } と、結構いい加減に作ってみました。 動作確認はしてないです。
補足
本当に申し訳ないのですが、どこで平均を計算しているのでしょうか?範囲指定(350~400など)出来る部分があれば教えてください。あとできれば詳しい説明も下さい。 何度も本当にすいません。perl初心者で勉強不足なんで、なかなか理解できないんです。お願いします。
- moon_night
- ベストアンサー率32% (598/1831)
よくやりたいことがわかりません。 もう少し具体的に教えていただければと思います。 例えば、○行から○行までの平均を取りたい、 (この行数は可変で350~360と400~410といったように連続しない行数の可能性がある)や、 想定する結果結果を表示して、このように表示されるようにしたい というようなものがあれば多少答えることもできるかと思いますが、 これでは5つの数字の各平均をだすのか、5つの数字の平均を出すのかもわかりません。 もう少し補足をお願いします。
補足
すいません。補足を入れます。 上に出した例では5つの各平均を出したいです。 出力するものとしては↓のように出来ればいいと思います。説明不足ですいません。 sp 1 1 1 1 1 s/d s s s s s n/o new new new old old r/t ref ref tra ref ref no. 102 103 104 107 108 350 0.05 0.05 0.00 0.05 0.05 351 0.05 0.05 0.01 0.05 0.05 352 0.05 0.05 0.01 0.05 0.05 353 0.05 0.05 0.01 0.05 0.05 354 0.05 0.05 0.01 0.05 0.05 355 0.05 0.05 0.01 0.05 0.05 356 0.05 0.05 0.01 0.05 0.05 357 0.05 0.05 0.01 0.05 0.05 358 0.05 0.05 0.01 0.05 0.05 359 0.05 0.05 0.01 0.05 0.05 mean(350~400) 0.5 0.4 0.3 0.6 0.2
お礼
本当にありがとうございます。 少しずつ勉強して行きたいと思います。