考虑一下我在MATLAB中有这样一个类型的表:
Location String Number
1 a 26
1 b 361
2 c 28
2 a 45
3 a 78
4 b 82
我想创建一个只返回3行的脚本,其中包含每个字符串的最大Number。因此,在这种情况下,返回的表将如下:
Location String Number
3 a 78
1 b 361
2 c 28
我想解决的实际表格要大得多,尽管为了简单起见我这样写了。关于如何处理这项任务的任何想法?提前感谢您的时间!
答案 0 :(得分:1)
您可以使用splitapply
,每行id
。
请参阅评论了解详情...
% Assign unique ID to each row
tbl.id = (1:size(tbl,1))';
% Get groups of the different strings
g = findgroups(tbl.String);
% create function which gets id of max within each group
% f must take arguments corresponding to each splitapply table column
f = @(num,id) id(find(num == max(num), 1));
% Use splitapply to apply the function f to all different groups
idx = splitapply( f, tbl(:,{'Number','id'}), g );
% Collect rows
outTbl = tbl(idx, {'Location', 'String', 'Number'});
>> outTbl =
Location String Number
3 'a' 78
1 'b' 361
2 'c' 28
或者只是一个简单的循环。 1}}这个循环只有String
的唯一值,所以应该很快。
u = unique(tbl.String);
c = cell(numel(u), size(tbl,2));
for ii = 1:numel(u)
temp = tbl(strcmp(tbl.String, u{ii}),:);
[~, idx] = max(temp.Number);
c(ii,:) = table2cell(temp(idx,:));
end
outTbl = cell2table(c, 'VariableNames', tbl.Properties.VariableNames);
答案 1 :(得分:0)
找到我想法的每个字符串的最大值。
创建所有字符串的向量,并且只包含一次。类似的东西:
strs=['a','b','c'];
然后创建一个矢量,用于存储每个字符串的最大值:
n=length(strs);
max_values=zeros(1,n);
现在创建一个包含整个数据大小的循环,将当前max_value与当前值进行比较,并替换current_value>max_value
:
for i=1:your_table_size
m=find(strs==current_table_string); % This finds the index of max_values
if max_values(m)<current_table_Number % This the the i_th row table_number
max_values(m)=current_table_Number;
end
end