• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlでの平均計算について)

Perlでの平均計算について

このQ&Aのポイント
  • Perlを使って、与えられたデータから特定のカラムの平均値を求める方法がわかりません。
  • データの中の特定のカラムが同じ値を持つレコードをグループ化し、そのグループごとにカラム2の平均値を計算したいです。
  • 誰かPerlに詳しい方に教えていただけると助かります。お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 1204533
  • ベストアンサー率28% (41/144)
回答No.1

それほど プログラムができる人間ではないですが。。。 このような ロジックではいかがでしょうか? 連想配列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}で 求まると思います。

perl_prac
質問者

お礼

早速の回答ありがとうございます。 hashにもあまり慣れていないプログラミング初心者でなかなか理解するのが難しい状態です。もしよろしければもう少し具体的な構成を教えていただけないでしょうか?

その他の回答 (2)

  • kuroizell
  • ベストアンサー率55% (95/170)
回答No.3

インデントの都合上、全角スペース使ってるので置換して下さい。 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

perl_prac
質問者

お礼

求めたかったデータを得ることができました。 丁寧に回答していただき本当にありがとうございました。

  • 1204533
  • ベストアンサー率28% (41/144)
回答No.2

あまりプログラムが得意でないので、効率よいきれいなプログラムでないかもしれませんが、 かきのようなもので どうでしょうか? 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 とかでてくるのではないでしょうか?

perl_prac
質問者

お礼

詳細にプログラムまで書いていただきありがとうございます。 おかげさまでデータ処理を行うことができました。 ありがとうございました!

関連するQ&A