我有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
答案 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