Select 来自 table 的聚集行

Select clustered rows from a table

我会尝试将我的问题写在列表中以便于理解:

这就是我想要做的:

我想知道如何在 MATLAB R2015b 中完成此操作?我知道我可以使用 T.YesNo = newArr; 在 table 中创建一个新列,其中 newArr 是具有 01 值的 1000x1 double

作为一个小例子,如果 T10x3 并且只有 3 个 classes (1,2,3),下面是 T 的样子:

ID  Name    Class   
0   'a'     3
1   'b'     2
2   'a'     2
3   'b'     2
4   'a'     3
5   'a'     1
6   'a'     1
7   'b'     2
8   'b'     1
9   'a'     2

因此,如上所示,Class3 是计数最少的,只有 2 行。所以我想随机 select 两行 Class1 和 Class2 然后将这些随机 selected 行的新列的值设置为 1 而其余的将是 0,如下所示:

ID  Name    Class   YesNo
0   'a'     3       1
1   'b'     2       0
2   'a'     2       1
3   'b'     2       0
4   'a'     3       1
5   'a'     1       0
6   'a'     1       1
7   'b'     2       0
8   'b'     1       1
9   'a'     2       1

见下面的代码。它应该是不言自明的。如果有什么不清楚 - 请询问。

function q42944288
%% Definitions
MAX_CLASS = 20;
%% Setup
tmp = struct;
tmp.Data = rand(1000,1);
tmp.Class = uint8(randi(MAX_CLASS,1000,1)); % uint8 for efficiency
T = table(tmp.Data,tmp.Class,'VariableNames',{'Data','Class'});
%% Solution:
% Step 1:
[count,minVal] = min(histcounts(T.Class,'BinMethod','integers'));
% Steps 2+3:
T.YesNo = T.Class == minVal;
% Steps 4+5+6:
whichClass = bsxfun(@eq,T.Class,1:MAX_CLASS); % >=R2007a syntax
% whichClass = T.Class == 1:MAX_CLASS; % This is a logical array, >=R2016b syntax.
for indC = setdiff(1:MAX_CLASS,minVal) 
  inds = find(whichClass(:,indC));
  T.YesNo(inds(randperm(numel(inds),count))) = true; 
end
%% Test:
fprintf(1,'\nThe total number of classes is %d', numel(unique(T.Class)));
fprintf(1,'\nThe minimal count is %d',count);
fprintf(1,'\nThe total number of 1''s in T.YesNo is %d', sum(T.YesNo));