- ベストアンサー
Perlでの平均計算について
- Perlを使って、与えられたデータから特定のカラムの平均値を求める方法がわかりません。
- データの中の特定のカラムが同じ値を持つレコードをグループ化し、そのグループごとにカラム2の平均値を計算したいです。
- 誰かPerlに詳しい方に教えていただけると助かります。お願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
それほど プログラムができる人間ではないですが。。。 このような ロジックではいかがでしょうか? 連想配列hashを 2種類活用し、 1つ目のhash カラム1の種類ごとに カラム2を足していく。 (hash{カラム1}に どんどん カラム1が同じもののカラム2の値を足していく。) hash{カラム1}=hash{カラム1}+カラム2 2つ目のhash2 カラム1の種類ごとに、各カラム1のおなじものが 何個あるか カウントしていく。 (hash2{カラム1}に カラム1が同じものをカウントしていく。) hash2{カラム1}=hash2{カラム1}+1 平均値は hash{カラム1}/hash2{カラム1}で 求まると思います。
その他の回答 (2)
- kuroizell
- ベストアンサー率55% (95/170)
インデントの都合上、全角スペース使ってるので置換して下さい。 use strict; use warnings; # データのぶちこみ場所(2次ハッシュ) my %data; # CSVデータはスクリプト中に書けるので、今回はそれを使います while (<DATA>) { chomp $_; my @cols = split(',', $_); # 各カラムごとの合計(sum)、個数(cnt) $data{$cols[0]}{sum} += $cols[1]; $data{$cols[0]}{cnt}++; } foreach my $col (sort keys %data) { # 適当に出力 print "Colmns $col : Avg = " . $data{$col}{sum} / $data{$col}{cnt} . "\n"; } __DATA__ 1,123.93 1,322.32 1,232.21 1,124.32 1,234.12 2,123.43 2,12.34
お礼
求めたかったデータを得ることができました。 丁寧に回答していただき本当にありがとうございました。
- 1204533
- ベストアンサー率28% (41/144)
あまりプログラムが得意でないので、効率よいきれいなプログラムでないかもしれませんが、 かきのようなもので どうでしょうか? open(IN,ファイル1); while(<IN>){ $line = $_; chomp $line; @array = split(/\t/,$line); $id1 = $array[0]; $score = $array[1]; if(exists $hash{$id1}){ $hash{$id1}=$hash{$id1}+$score; $hash2{$id1}=$hash2{$id1}+1; } else { $hash{$id1}=$score; $hash2{$id1}=1; } } close(IN); foreach(sort keys %hash) { my $key=$_; my $value=$hash{$_}; my $value2=int($value/$hash2{$_}); 商だけを採用するのであれば intを利用 print $key.' -> '.$value2."\n" } とすると 1 -> XXX とかでてくるのではないでしょうか?
お礼
詳細にプログラムまで書いていただきありがとうございます。 おかげさまでデータ処理を行うことができました。 ありがとうございました!
お礼
早速の回答ありがとうございます。 hashにもあまり慣れていないプログラミング初心者でなかなか理解するのが難しい状態です。もしよろしければもう少し具体的な構成を教えていただけないでしょうか?