Unique不适用于具有NaN条目的表 - MATLAB

时间:2015-02-02 13:55:19

标签: matlab

我有table个重复的行,我尝试使用unique中的Matlab删除这些行。但是,我并不是为所有人工作。这个玩具示例说明了我的观点。关于如何删除它们的任何想法?

AAA = table(repmat('0122',2,1),repmat('011',2,1),repmat(NaN,2,1))

ans = 

    Var1    Var2    Var3
    ____    ____    ____

    0122    011     NaN 
    0122    011     NaN 

unique(AAA)

ans = 

    Var1    Var2    Var3
    ____    ____    ____

    0122    011     NaN 
    0122    011     NaN 

3 个答案:

答案 0 :(得分:4)

由于NaN值,您似乎遇到了问题。

隐藏在文档中,提到:

  

unique将NaN值视为不同。

我想你可以通过在使用unique之前用虚拟值替换nan值来解决这个问题。

答案 1 :(得分:3)

介绍性讨论

unique 上的Mathworks文档说明了以下内容 -

  

C = unique(A)返回与A中相同的数据,但没有   重复。

     

如果A是表格,则unique会返回A中的唯一行。该   表C的行按排序顺序排列。

因此,对于table作为unique输入的情况,它表明它基本上类似于unique(....'rows'),只要您可以对该表的每个条目进行ID。我们在这里使用的技巧是将所有这些条目转换为单元格数组的单元格,然后对每个单元格进行ID,然后将这些数字ID与unique(...'rows')一起使用。

功能代码

接下来列出的代码只是 -

function Tout = unique_table(T)

%// Convert input table into a cell array
Tcell = cellfun(@(x) num2str(x),table2cell(T),'Uni',0);

%// ID all cells of the cell array
[~,~,id_cells] = unique(Tcell);

%// Use the cell IDs to find the unique row IDs
[~,unq_rowid] = unique(reshape(id_cells,size(Tcell)),'rows');

%// Use the row IDs to get the expected table with unique rows
Tout = T(unq_rowid,:);

return;

测试运行

案例#1:原始案例

T = 
    Var1    Var2    Var3
    ____    ____    ____
    0122    011     NaN 
    0122    011     NaN 
Tout = 
    Var1    Var2    Var3
    ____    ____    ____
    0122    011     NaN 

案例#2:修改案例

T = 
    Var1    Var2    Var3
    ____    ____    ____
    0122    011      56 
    0122    011     NaN 
Tout = 
    Var1    Var2    Var3
    ____    ____    ____
    0122    011      56 
    0122    011     NaN 

答案 2 :(得分:0)

只需使用Inf代替NaN

>> AAA = table(repmat('0122',2,1),repmat('011',2,1),repmat(inf,2,1))

AAA = 

Var1    Var2    Var3
____    ____    ____

0122    011     Inf 
0122    011     Inf 

>> unique(AAA)

ans = 

Var1    Var2    Var3
____    ____    ____

0122    011     Inf