フィルターのクリア

grouping data by value

17 ビュー (過去 30 日間)
wesso Dadoyan
wesso Dadoyan 2015 年 8 月 4 日
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 件のコメント
Image Analyst
Image Analyst 2015 年 8 月 4 日
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 2015 年 8 月 4 日
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.

サインインしてコメントする。

採用された回答

Cedric
Cedric 2015 年 8 月 4 日
編集済み: Cedric 2015 年 8 月 4 日
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} ) ;
  1 件のコメント
Chanaka Keerthisinghe
Chanaka Keerthisinghe 2018 年 6 月 7 日
Thank you,

サインインしてコメントする。

その他の回答 (1 件)

Azzi Abdelmalek
Azzi Abdelmalek 2015 年 8 月 4 日
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 件のコメント
wesso Dadoyan
wesso Dadoyan 2015 年 8 月 4 日
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

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeData Distribution Plots についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by