1

いくつかの列に値が繰り返されている単純な行列があります。データを名前と週でグループ化し、特定の週に毎日費やした価格を合計する必要があります。次に例を示します。

 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

それを行うための良い方法はありますか?forループを使用しましたが、それが最善の方法かどうかはわかりません。

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  
4

2 に答える 2

3

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

于 2012-03-28T20:38:58.387 に答える
1

おそらく最も簡単な方法は、Statistical ToolboxのGRPSTATS関数を使用することです。nameグループを生成するには、week最初にとを組み合わせる必要があります。

[name_week priceSum] = grpstats(price, strcat(name(:), '@', week(:)), {'gname','sum'});
于 2012-03-28T20:41:26.273 に答える