一般来说,如果你有一个数字数组:
a = [4 2 1 8 -2];
可以通过首先对数组进行排序然后尝试访问百分位数中提供的索引来计算百分位数。所以prctile(a,20)的功能原则上可以替换为
b = sort(a);
ind = round(length(b)*20/100);
if ind==0
ind = 1;
end
b = b(ind);
% b = -2
然而,prctile 做了一些花哨的魔法插值输入向量以获得受数组大小影响较小的值。但是,您可以使用上面的想法来找到百分位拆分列。如果你选择像我上面说的那样做,你想要得到对应于 20% 和 80% 百分位数的标题是循环遍历行,删除 NaN,获取剩余排序的索引值并获取 20% 或 80% 百分位数的特定索引。很遗憾,我有一个不支持表格的旧版本的 Matlab,所以我无法验证是否正确返回了标题名称,但想法应该很清楚。
L = cell(size(T,1),1);
U = cell(size(T,1),1);
for row=1:size(T,1)
row_values = T{row,:};
row_values = row_values(2:end); % Remove date column
non_nan_indeces = find(~isnan(row_values));
if not(isempty(non_nan_indeces))
[row_values,sorted_indeces] = sort(row_values(non_nan_indeces));
% The +1 is because we removed the date column
L_ind = non_nan_indeces(sorted_indeces(1:round(0.2*length(row_values))))+1;
U_ind = non_nan_indeces(sorted_indeces(round(0.8*length(row_values)):end))+1;
% I am unsure about this part
L{row} = T.Properties.VariableNames(L_ind);
U{row} = T.Properties.VariableNames(U_ind);
else
L{row} = nan;
U{row} = nan;
end
end;
如果你想使用 matlab 的prctile,你必须像这样找到返回值的索引:
L = cell(size(T,1),1);
U = cell(size(T,1),1);
for row=1:size(T,1)
row_values = T{row,:};
row_values = row_values(2:end); % Remove date column
non_nan_indeces = find(~isnan(row_values));
if not(isempty(non_nan_indeces))
[row_values,sorted_indeces] = sort(row_values(non_nan_indeces));
L_val = prctile(row_values(non_nan_indeces),20);
U_val = prctile(row_values(non_nan_indeces),80);
% The +1 is because we removed the date column
L_ind = non_nan_indeces(sorted_indeces(find(row_values<=L_val)))+1;
U_ind = non_nan_indeces(sorted_indeces(find(row_values>=U_val)))+1;
% I am unsure about this part
L{row} = T.Properties.VariableNames(L_ind);
U{row} = T.Properties.VariableNames(U_ind);
else
L{row} = nan;
U{row} = nan;
end
end;