我试图在矩阵中获得观察的等级,同时考虑到可以重复自己的NaN和值。
E.g。如果我们有
A = [0.1 0.15 0.3; 0.5 0.15 0.1; NaN 0.2 0.4];
A =
0.1000 0.1500 0.3000
0.5000 0.1500 0.1000
NaN 0.2000 0.4000
然后我想获得以下输出:
B =
1 2 4
6 2 1
NaN 3 5
因此0.1是最低值(rank = 1),而0.5是最高值(rank = 6)。
理想情况下,没有循环的有效解决方案。
答案 0 :(得分:3)
您可以使用unique
。默认情况下,这会对数据进行排序,您可以获取已排序的唯一值的索引。这会复制你的领带行为,因为相同的值将具有相同的索引。您可以使用逻辑索引省略NaN
值。
r = A; % or NaN(size(A))
nanIdx = isnan(A); % Get indices of NaNs in A to ignore
[~, ~, r(~nanIdx)] = unique(A(~nanIdx)) % Assign non-NaN values to their 'unique' index
>> r =
[ 1 2 4
6 2 1
NaN 3 5 ]
如果您拥有统计工具箱,则可以使用tiedrank
功能获得类似的结果。
r = reshape(tiedrank(A(:)), size(A)) % Have to use reshape or rank will be per-column
>> r =
[ 1.5, 3.5, 6.0
8.0, 3.5, 1.5
NaN, 5.0, 7.0 ]
这不是您想要的结果(根据您的示例)。您可以看到tiedrank
实际上使用的是比您更常规的排名系统,其中平局为每个结果提供平均排名。例如,并列第1和第2,每个等级为1.5,下一等级为3.