Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 规范化按第一列值分组的表变量_Matlab - Fatal编程技术网

Matlab 规范化按第一列值分组的表变量

Matlab 规范化按第一列值分组的表变量,matlab,Matlab,我有下表(8行) 这里,4行中的每一行都是一个组。我想使每个群体的年龄正常化。例如,“Smith”的最小年龄为1岁,“Smith”的最大年龄为100岁(其余以最大和最小年龄为基础)。我想和詹姆斯做同样的事

我有下表(8行)

这里,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
  ""                    ""
  ""                    "" 
  ""                    ""  
  ""                    ""

首先,让我们构造表

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'
然后使用的第三个输出为每个唯一的姓氏分配唯一的ID

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

%    1     1     1     1     2     2     2     2
然后可以使用来规范化每个组

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

%   [4x1 double]    [4x1 double]
然后我们可以使用
cat
展平
标准化的
,乘以100得到
0
100
之间的值,然后替换
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});

首先,让我们构造表

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'
然后使用的第三个输出为每个唯一的姓氏分配唯一的ID

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

%    1     1     1     1     2     2     2     2
然后可以使用来规范化每个组

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

%   [4x1 double]    [4x1 double]
然后我们可以使用
cat
展平
标准化的
,乘以100得到
0
100
之间的值,然后替换
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});

你的名字真的以这样的数字结尾吗?我已经添加了一部分原始数据。对于每个组(8行),我想将最小值规范化为1,最大值规范化为5。您的名字是否真的以这样的数字结尾?我已经添加了一部分原始数据。对于每组(8行),我想将最小值标准化为1,最大值标准化为5。谢谢你的回答。代码:
normalized=splitapply(@(x){(x-min(x))./(max(x)-min(x))},t.年龄,ind)不起作用,它说:未定义的函数或变量“splitapply”@Hasan已更新为使用
accumarray
,因为您似乎没有使用R2015,如果我想在1到5之间对其进行规格化,该怎么办?(最小年龄=1,最大年龄=5)?亲爱的Suever,我这里还有一个问题:你能核对一下吗?谢谢你的回答。代码:
normalized=splitapply(@(x){(x-min(x))./(max(x)-min(x))},t.年龄,ind)不起作用,它说:未定义的函数或变量“splitapply”@Hasan已更新为使用
accumarray
,因为您似乎没有使用R2015,如果我想在1到5之间对其进行规格化,该怎么办?(最小年龄=1,最大年龄=5)?亲爱的Suever,我还有一个问题:你能检查一下吗