2016-06-16 4 views
1

次の表があります(8行)。最初の列の値でグループ化されたテーブル変数を正規化します

Name  Age Height Weight  
__________ ___ ______ ______  

'Smith4'  30  71  176    
'Smith6'  80  69  163    
'Smith1'  10  64  131    
'Smith4'  40  67  133    
'James9'  49  64  119    
'James5'  56  45   56    
'James5'  87  56  890    
'James5'  23  56   43    

ここでは、4つの行のそれぞれがグループです。私は各グループの年齢を正規化したい。たとえば、「Smith」の最小年齢は1を指し、「Smith」の最大年齢は100を指します(残りは最大と最小に基づいています)。同じ事を私はジェームスとやりたい。
誰かがどのように私はそれをMATLABでループできるか知っていますか?誰も私にコードを書くことができますか?

私のオリジナルデータ:

 name    value 
______________________ ______________ 

'kiemo_250'   1.3586 
'kiemo_298-10M'  0.35857 
'kiemo_298-12M'  0.48857 
'kiemo_298-16M'  0.70429 
'kiemo_298-24M'  0.97857 
'kiemo_298-32M'  1.0429 
'kiemo_298-5M'  0.012857 
'kiemo_298-8M'  0.17857 
'neywork_250'   1.01 
'neywork_298-12M'  0.69714 
'neywork_298-18M'  0.76286 
'neywork_298-1M'  0.0057143 
'neywork_298-3M'  0.29429 
'neywork_298-5M'  0.47857 
'neywork_298-6M'  0.54286 
'neywork_298-8M'  0.61429 
'man-10M'    0.58286 
'man-14M'    0.56571 
'man-18M'    0.51857 
'man-24M'    0.55714 
'man-30M'    0.51143 
'man-4M'    0.39714 
'man-8M'    0.52143 
'man'     0.40857 
    ""     "" 
    ""     "" 
    ""     "" 
    ""     "" 
+0

名前は実際にはそのような番号で終わりますか? – Suever

+0

オリジナルデータの一部を追加しました。 各グループ(8行)で最小値を1に、最大値を5に正規化します。 – Hasan

答えて

0

まずあなたが主要な姓を決定するためにregexpを使用することができ、テーブル

t = table({'Smith4'; 'Smith6'; 'Smith1'; 'Smith4'; 'James1'; 'James5'; 'James5'; 'James5'}, [30 80 10 40 49 56 87 23]', 'VariableNames', {'Name', 'Age'}) 

%  Name  Age 
% ________ ___ 
% 
% 'Smith4' 30 
% 'Smith6' 80 
% 'Smith1' 10 
% 'Smith4' 40 
% 'James1' 49 
% 'James5' 56 
% 'James5' 87 
% 'James5' 23 

を構築しましょう。

lastname = regexp(t.Name, '^[A-Za-z]*', 'match', 'once'); 

% 'Smith' 'Smith' 'Smith' 'Smith' 'James' 'James' 'James' 'James' 

次に次にあなたは私たちがすることができますそして、各グループに

normalized = accumarray(ind, t.Age, [], @(x){(x - min(x)) ./ (max(x) - min(x))}); 

% [4x1 double] [4x1 double] 

を正規化するためにaccumarrayを使用することができます

[~, ~, ind] = unique(lastname, 'stable'); 

% 1  1  1  1  2  2  2  2 

それぞれ独自の姓に固有のIDを割り当てるためにuniqueの第3の出力を使用しますnormalizedを使用してcatを平方化し、100を掛けて0との間の値を取得します、代わりにあなたの正規化された値が一定の範囲(1から5)の範囲内になりたい場合は、t.Age

t.Age = cat(1, normalized{:}) * 100; 

%  Name  Age 
% ________ ______ 
% 
% 'Smith4' 28.571 
% 'Smith6'  100 
% 'Smith1'   0 
% 'James1' 40.625 
% 'James5' 51.562 
% 'James5'  100 
% 'James5'   0 

更新

を交換するには、次の操作を行います。

lower = 1; 
upper = 5; 

normalized = accumarray(ind, t.Age, [], @(x){((x - min(x)) ./ (max(x) - min(x))) * (upper-lower) + lower}); 
+0

あなたの答えに感謝します。コードは:normalized = splitapply(@(x){(x - min(x))./(max(x) - min(x))}、t.Age、ind); 'うまくいきません。未定義の関数または変数 'splitapply' – Hasan

+0

元の(一部の)サンプルデータで元の質問を更新しました... – Hasan

+0

@Hasan R2015bを使用していないため、 'accumarray'を使用するように更新されました – Suever

関連する問題