我有一个包含两列的表,其中包含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
.
.
.
请帮帮我。
答案 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,这是在他们介绍splitapply
或findgroups
之前。您可以改用此方法:
[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;