如何从排名向量中排除NaNs

时间:2015-10-28 13:36:41

标签: matlab sorting nan

我们正在研究MATLAB代码以对股票进行排名。我们没有完整的数据集,因此必须处理一些NaN。但是,在我们用于排序的代码中,NaN排名最高。我们的目的是从排名中排除NaN。怎么做?

请考虑使用SPACEBARY以下

的示例
stockkid

运行程序会导致:

Y = [1.2 1.3 NaN 0.9 0.95 NaN 0.8 0.7];
stockid = [801 802 803 804 805 806 807 808];
[totalmonths,totalstocks] = size(Y);
nbrstocks = totalstocks - sum(isnan(Y));
[B,I] = sort(Y,'descend');
ncandidates = 4;
idwinner(1:ncandidates) = stockid(I(1:ncandidates));

因此,803对应于NaN,806对应于NaN,802对应于1.3等。

我们的目标应该是:

Y =

    1.2000    1.3000       NaN    0.9000    0.9500       NaN    0.8000    0.7000
idwinner =

   803   806   802   801

那么,我们如何从排名中排除NaN?

3 个答案:

答案 0 :(得分:3)

使用

Y(isnan(Y)) = -inf;

在致电sort之前。这会将NaN值更改为-inf,因此这些值将是最低值。

或者,如果您不想更改Y中的任何值,可以使用以下中间索引:

Y = [1.2 1.3 NaN 0.9 0.95 NaN 0.8 0.7];
stockid = [801 802 803 804 805 806 807 808];

ind = find(~isnan(Y)); %/ intermediate index that tells which elements are numbers
[B,I] = sort(Y(ind),'descend');
ncandidates = 4;
idwinner(1:ncandidates) = stockid(ind(I(1:ncandidates))); %// apply intermediate index

答案 1 :(得分:0)

在您的sort语句后,添加以下行:I = I(~isnan(B));,这将删除与NaN关联的索引,然后再从stockids

中选择它们

答案 2 :(得分:0)

 I = I(~isnan(B)); 

效果最佳,因为我们不会像使用

那样覆盖NaN
 Y(isnan(Y)) = -inf;

因为我们后来也必须从具有最低回报的股票中确定失败者投资组合。这对最后一个代码不起作用,因为所有NaN的回报最低而不是具有实际数据的股票。