在matlab中将表转换为二进制矩阵

时间:2016-06-05 19:31:16

标签: matlab matrix

我有一个包含两列的表,其中包含memberid(审查产品的成员的ID)和productid(审阅者为其撰写评论的产品的ID)。

例如:

    memberid  productid
     A             x
     A             y
     A             z
     B             x
     B             z
     B             w

我想将此表格转换为二进制矩阵:

   x y z w . . .
a  1 1 1 0
b  1 0 1 1
.
.
.

请帮帮我。

1 个答案:

答案 0 :(得分:0)

您可以使用splitapply首先按第一列对所有内容进行分组,然后针对每个组检查第二列的成员资格。

% Create the data
t = table({'A';'A';'A';'B';'B';'B'}, {'x'; 'y';'z';'x';'z';'w'}, ...
          'VariableNames', {'memberid', 'productid'});

% Group by the first column values
groups = findgroups(t.memberid);

% Get the unique product ids (and maintain their order of appearance)
productids = unique(t.productid, 'stable').';

% Determine which values of the second column exist for each group
membership = splitapply(@(x)ismember(productids, x), t.productid, groups);

%   1     1     1     0
%   1     0     1     1

如果你愿意,你可以把它包装成一行。

membership = splitapply(@(x)ismember(unique(t.productid, 'stable').', x), t.productid, findgroups(t.memberid));

此结果按行在表中显示的顺序使用行和列的顺序。如果你想让行和列按字母顺序升序排列,那么你需要像这样定义productids

productids = unique(t.productid).';

或者再次,作为一行

membership = splitapply(@(x)ismember(unique(t.productid).', x), t.productid, findgroups(t.memberid));

<强>更新

由于您使用的是R2014b,这是在他们介绍splitapplyfindgroups之前。您可以改用此方法:

[uids, ~, memberids] = unique(t.memberid, 'stable');
[upids, ~, productids] = unique(t.productid, 'stable');

membership = false(numel(uids), numel(upids));
membership(sub2ind(size(membership), memberids, productids)) = true;