2012-03-28 11 views
1

私はいくつかの列に値が繰り返された単純な行列を持っています。私は名前と週ごとにデータをグループ化し、毎週与えられた毎日の料金を合計する必要があります。ここでの例です:Matlabでのグループ化と要約

name day week price 
John 12 12 200 
John 14 12 70 
John 25 13 150 
John 1 14 10 
Ann 13 12 100 
Ann 15 12 100 
Ann 20 13 50 

所望の出力は次のようになります。

name week sum 
    John 12 270 
    John 13 150 
    John 14 10 
    Ann 12 200 
    Ann 13 50 

はそれを行うための良い方法はありますか?私は、ループのために使用されますが、確かではない、それはそれを行うための最善の方法である:

names= unique(data(:,1)); % getting unique names from data 
n=size(names, 1);   % number of unique names 
m=size(data(:,1),1);  % number of total rows 
sum=[];     % empty matrix for writing the results 
for i = 1:n    
     temp=[];   % creating temporar matrix 
     k=1; 
    for j=1:m 
     if name(i)==data(j,1)  % going through all the rows and getting the rows of 
      temp(k,:)=data(j,:); % the same name and putting in temporar matrix 
      k=k+1; 
     end 
    end 
    count=0; 
    s=1; 
    for l = 1:size(temp,1)-1  % going through temporar matrix of one name(e.g.John) 
     if temp(l,3)==temp(l+1,3) % checking if the day of current row is equal to the 
     count=count+temp(l,4); % date of the next row (the data is sorted by name 
     else      % and date) and then summing the prices 4th column 
      sum(s, 1:3)=[names(i) temp(l,3) count]; 
      count=0;    % if the days are not equal, then writing the answer 
      s=s+1;    % to the output matrix sum 
     end   
    end 
end 
+0

単一文字の変数名やコメントの欠如の組み合わせは従って、あなたのコードは非常に困難にします。変数名を展開してコードの意図をコメントできますか? –

答えて

3

使用accumarray。このような値をグループ化して集計します。 unique(data(:,1))の3番目のotuput引数を使用して、subs引数に渡す数値インデックスをaccumarrayにすることができます。詳細については、doc accumarrayを参照してください。

1

統計ツールボックスのGRPSTATS機能を使用するのが最も簡単な方法でしょう。あなたはnameweek生成する最初のグループを結合する必要があります。

[name_week priceSum] = grpstats(price, strcat(name(:), '@', week(:)), {'gname','sum'}); 
関連する問題