プロが教えるわが家の防犯対策術!

以下のようなデータがあります。そこでカラム1が等しい値をもつものを一グループとし、カラム2の平均値を求めたいのですが、なかなかうまくいきません。どなたかご教授をお願いいたします。よろしくお願いします。



カラム1   カラム2

1         123.93
1         322.32
1         232.21
1         124.32
1         234.12
2         123.43
2        12.34
2          .
2          .
2          .
3 
3
3
4
4
4
4

A 回答 (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}で 求まると思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/14 02:12

あまりプログラムが得意でないので、効率よいきれいなプログラムでないかもしれませんが、


かきのようなもので どうでしょうか?

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 とかでてくるのではないでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/14 15:34

インデントの都合上、全角スペース使ってるので置換して下さい。



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
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/09/14 15:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!