2016-06-16 13 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行中的每一行都是一組。我想規範每個組的年齡。例如,'史密斯'的最小年齡將指向1,'史密斯'的最大年齡將指向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

首先,讓我們構造表

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 

您可以使用regexp來確定領先的姓氏。

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

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

然後使用unique第三輸出到一個唯一的ID分配給每個獨特的姓氏

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

% 1  1  1  1  2  2  2  2 

然後你可以使用accumarray正常化每組

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

% [4x1 double] [4x1 double] 

然後我們就可以使用cat拉平normalized,乘以100 0和之間,讓您的值,然後更換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 

更新

相反,如果你希望你的歸一化值在一定範圍內(1 - 5)內,你會做以下。

lower = 1; 
upper = 5; 

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

謝謝您的回答。代碼:'歸= splitapply(@(X){(X - 分鐘(X))./(MAX(X) - 分鐘(X))},t.Age,IND);'不起作用,它表示:未定義的函數或變量'splitapply' – Hasan

+0

我已更新我的原始問題與我的原始(部分)示例數據... – Hasan

+0

@Hasan更新爲使用'accumarray',因爲您似乎沒有使用R2015b – Suever