在MATLAB中查找列的最大数量,该列分配给特定字符串

时间:2018-02-20 12:14:41

标签: matlab

考虑一下我在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

我想解决的实际表格要大得多,尽管为了简单起见我这样写了。关于如何处理这项任务的任何想法?提前感谢您的时间!

2 个答案:

答案 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   

或者只是一个简单的循环。 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