Matlab 规范化按第一列值分组的表变量
我有下表(8行) 这里,4行中的每一行都是一个组。我想使每个群体的年龄正常化。例如,“Smith”的最小年龄为1岁,“Smith”的最大年龄为100岁(其余以最大和最小年龄为基础)。我想和詹姆斯做同样的事<有人知道如何在MATLAB中循环它吗?有人能给我写代码吗 我的原始数据:Matlab 规范化按第一列值分组的表变量,matlab,Matlab,我有下表(8行) 这里,4行中的每一行都是一个组。我想使每个群体的年龄正常化。例如,“Smith”的最小年龄为1岁,“Smith”的最大年龄为100岁(其余以最大和最小年龄为基础)。我想和詹姆斯做同样的事
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,我还有一个问题:你能检查一下吗