2012-03-28 6 views
1

Ich habe eine einfache Matrix mit sich wiederholenden Werten in einigen Spalten. Ich muss Daten nach Namen und Woche gruppieren und die Preise addieren, die an jedem Wochentag ausgegeben werden. hier ist das Beispiel:Gruppierung und Zusammenfassung in 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 

Die gewünschte Ausgabe wäre:

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

Gibt es eine schöne Möglichkeit, es zu tun? Früher habe ich für Schleifen, aber nicht sicher, es ist der beste Weg, es zu tun:

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

Die Kombination aus einem Buchstaben bestehenden Variablennamen und das Fehlen von Kommentaren machen Sie Ihren Code sehr schwer zu folgen. Könnten Sie bitte die Variablennamen erweitern und die Absicht des Codes kommentieren? –

Antwort

3

Verwendung accumarray. Es wird solche Werte gruppieren und zusammenfassen. Sie können das dritte Otuput-Argument von unique(data(:,1)) verwenden, um die numerischen Indizes an das subs-Argument von accumarray zu übergeben. Details siehe doc accumarray.

1

Wahrscheinlich ist der einfachste Weg, GRPSTATS Funktion von Statistical Toolbox zu verwenden. Sie müssen kombinieren die name und week ersten Gruppen zu erzeugen:

[name_week priceSum] = grpstats(price, strcat(name(:), '@', week(:)), {'gname','sum'}); 
Verwandte Themen