Filter löschen
Filter löschen

grouping data by value

17 Ansichten (letzte 30 Tage)
wesso Dadoyan
wesso Dadoyan am 4 Aug. 2015
I have a vector of data X that I want to divide into 10 different groups depending on the values. i,e the highest 10% together, then the lower 10% together etc.... How can I create another vector that assigns numbers to such groups. For example highest 10% should have a value of 1, then the lower 10% a value of 2 , ... then the lowest 10% a value of 10. I used :
DecileThresholds= quantile(X,(1:9)/10);
to find the points that separates the categories but I don't want to write a loop to categorize them. I thought that matlab probably has a function that automatically and elegantly give me the category number. Thanks
  2 Kommentare
Image Analyst
Image Analyst am 4 Aug. 2015
It's not clear to me. Let's say you have a normal distribution with 1000 elements with values going from 0 to 10. Do you want 10 arrays where each array has 100 (which is 10% of 1000) elements? Or do you want 10 arrays where each array can have a different number of elements, because the number of elements in the range 500-600 will be more than the number with values in the range 0-100?
wesso Dadoyan
wesso Dadoyan am 4 Aug. 2015
I want 10 arrays where each array has a different number of observations. Assume the value range is between 1 and 100 , then the 1st array (1st group) is of observations that fall between 1 and 10, 2nd group falls between 11 and 20 etc.... the number of values between 1 and 10 could be higher than those between 11 and 20, so the number of each array elements are not the same.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Cedric
Cedric am 4 Aug. 2015
Bearbeitet: Cedric am 4 Aug. 2015
x = [1, 8, 2, 3, 3, 7] ; % Dummy example.
[~, binId] = histc( x, [0, 4, 10] ) ; % Bin edges: 0 --bin1-- 4 --bin2-- 10
With that you get:
binId =
1 2 1 1 1 2
Then you can group them per bin:
grouped = accumarray( binId', x, [], @(v){v} ) ;

Weitere Antworten (1)

Azzi Abdelmalek
Azzi Abdelmalek am 4 Aug. 2015
A=rand(1,106);
n=numel(A);
[b,idx]=sort(A);
m=round(n/10);
p=n-m*9;
ii=repmat(1:9,m,1);
jj=[ii(:) ;10*ones(p,1)];
out=accumarray(jj,b',[],@(x) {x});
celldisp(out)
  1 Kommentar
wesso Dadoyan
wesso Dadoyan am 4 Aug. 2015
Thanks Azzi, the groups shouldn't be of equal size. Look at my comment to the inquiry of image analyst. I hve the impression that your codes generated equal groups and the remainder went to the last group

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Data Distribution Plots finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by