如何在Matlab中对单元格数组或结构进行类数据库分组?

时间:2013-08-01 20:35:41

标签: database matlab grouping cell-array

我在Matlab中有表格数据。它可以存储在struct或cell数组中。

如何使用unique(A,'rows')执行分组操作?由于某种原因,它不适用于单元阵列。

有一些方法吗?

更新

>> A={'Morgan', 'male', 12
'Morgan', 'female', 7
'Dottie', 'female', 5
'Dottie', 'female', 13}
A = 
    'Morgan'    'male'      [12]
    'Morgan'    'female'    [ 7]
    'Dottie'    'female'    [ 5]
    'Dottie'    'female'    [13]
>> A(:,1:2)
ans = 
    'Morgan'    'male'  
    'Morgan'    'female'
    'Dottie'    'female'
    'Dottie'    'female'
>> B=ans;
>> unique(B,'rows')
Warning: The 'rows' input is not supported for cell array inputs. 
> In cell.unique>celluniqueR2012a at 237
  In cell.unique at 149 
ans = 
    'Dottie'
    'Morgan'
    'female'
    'male'

如您所见,它不是按行分组,而是按行包中的所有值进行分组。

更新2

我正在研究的唯一方法是如下

>> [cell2mat(B(:,1)) repmat(':',size(B,1),1) cell2mat(B(:,2))]
Error using cat
Dimensions of matrices being concatenated are not consistent.
Error in cell2mat (line 84)
            m{n} = cat(1,c{:,n}); 

但它(1)非常复杂,(2)还不起作用。

更新3

我一直在寻找统计工具箱的可能性:

>> A={'Name', 'Gender', 'Age'; 'Ann', false, 20; 'John', true, 25; 'Peter', true, 30; 'Ann', false, 28}
A = 
    'Name'     'Gender'    'Age'
    'Ann'      [     0]    [ 20]
    'John'     [     1]    [ 25]
    'Peter'    [     1]    [ 30]
    'Ann'      [     0]    [ 28]
>> B=cell2dataset(A,'ReadVarNames',true)
B = 
    Name           Gender    Age
    'Ann'          false     20 
    'John'         true      25 
    'Peter'        true      30 
    'Ann'          false     28 
>> grpstats(B,{'Name','Gender'},{'numel'})
ans = 
               Name           Gender    GroupCount    numel_Age
    Ann_0      'Ann'          false     2             2        
    John_1     'John'         true      1             1        
    Peter_1    'Peter'        true      1             1        

1 个答案:

答案 0 :(得分:2)

如果正确理解您的示例,您想要的输出是:

ans =
    'Morgan'    'male'
    'Morgan'    'female'
    'Dottie'    'female'

unique忽略单元格数组中的行。您可以通过将列拼接在一起来欺骗它。一旦找到了唯一的行,就可以使用该列表从单元格数组中获取信息。

% Use A as you defined it
B = A(:, 1:2);
C = strcat(B(:,1), ';', B(:,2)); % this gives you 'Morgan;male', etc.
[D cRow] = unique(C); % Find the unique rows in your new 1-column list

E = B(sort(cRow), :); % Find the values in the cell array given the unique rows

这给出了:

E =
    'Morgan'    'male'
    'Morgan'    'female'
    'Dottie'    'female'

如果这不是您要查找的输出,请更新您的问题。