我有一个table
,其中一些(事实上,大多数)记录多次出现。我想重新排序记录,以便给定记录的所有多次出现是连续的,并且我想以保留“首次出现的顺序”的方式执行此操作。我还想要重新排序的表中每个唯一记录的第一次出现的索引,以便我可以快速访问每个重复记录块。
注意:在下面的例子中,tbl
指的是MATLAB的一个新的(从R2013b?)table
个对象,但这个例子也可行如果tbl
被简单地定义为字符向量。只需从table(
的定义中删除)
和tbl
。
这是一个例子。假设原始表是这样的:
>> tbl = table('CAABCB'.') % example works also with tbl = 'CAABCB'.';
tbl =
Var1
____
C
A
A
B
C
B
所需的重新排序表是
Var1
____
C
C
A
A
B
B
...并且第一个位置的向量是[1 3 5].'
。
(请注意,上面所需的重新排序表与sortrows(tbl)
生成的不同。区别在于所需表的排序保留了第一次出现的顺序,因此{{ 1}}来自C
和A
等,因为在原始表B
中,tbl
的第一次出现发生在C
的第一次出现之前}和A
。)
我是这样做的:
B
这会为 [~, ~, group_id_col] = unique(tbl, 'stable');
[sorted_group_id_col, sort_perm] = sort(group_id_col);
reordered_tbl = tbl(sort_perm, :);
[~, group_locs, ~] = unique(sorted_group_id_col, 'stable');
和reordered_tbl
生成所需的值,但它会通过四个 T ≥ O ( N < / em>)操作,其中 N 是group_locs
中的行数。
使用MATLAB内置函数可以用更少的此类操作完成吗?