创建表的索引 [英] Create an index to table

查看:108
本文介绍了创建表的索引的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一张桌子 T ,如下所示:

I have a table T as below:

T = table({'A';'A';'B';'B';'B';'B';'C';'C';'D';'D'},...
          {'xd';'z';'x';'y';'z';'w';'x';'wh';'z';'w'},...
          [4;2;4;1;2;5;2;1;1;5], ...
          'VariableNames', {'memberId', 'productId','Rating'});
T = 
memberId    productId    Rating
________    _________    ______
'A'         'xd'         4     
'A'         'z'          2     
'B'         'x'          4     
'B'         'y'          1     
'B'         'z'          2     
'B'         'w'          5     
'C'         'x'          2     
'C'         'wh'         1     
'D'         'z'          1     
'D'         'w'          5 

我需要通过 memberId productId 对其进行索引,结果是:

I need to index it by memberId and productId so the result is:

A: {'xd'  'z'}
B: {'x'  'y' 'z' 'w'}
C: {'x' 'wh'}
.......


推荐答案

您可以使用分类数组和结构来执行此操作:

You can use categorical arrays and a structure to do this:

% convert to categorical arrays
T.memberId = categorical(T.memberId);
T.productId = categorical(T.productId);
% cross-tabulate memberId vs. productId
cross_T = crosstab(T.memberId,T.productId);
% a function to return the productId for all 1 in row
productId = categories(T.productId).';
row = @(x) productId(logical(cross_T(x,:)));
% preform on all rows
rBy_c = arrayfun(row,1:size(cross_T,1),'UniformOutput',false).';
% convert to structure for readability
s = cell2struct(rBy_c,categories(T.memberId))

要获得输出( s ):

A: {'xd'  'z'}
B: {'w'  'x'  'y'  'z'}
C: {'wh'  'x'}
D: {'w'  'z'}

这篇关于创建表的索引的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆