6

我有两个数组:

OTPCORorder = [61,62,62,62,62,62,62,62,62,62,62,62,65,65,...]
AprefCOR = [1,3,1,1,1,1,1,1,1,1,2,3,3,2,...]

对于 OTPCORorder 中的每个元素,在 AprefCOR 中都有一个对应的元素。我想知道每组唯一 OTPCORorder 的数字 1 的百分比如下:

OTPCORorder1 = [61,62,65,...]
AprefCOR1 = [1,0.72,0,...]

我已经有了这个:

[OTPCORorder1,~,idx] = unique(OTPCORorder,'stable');
ANS = OTPCORorder1 = [61,62,65,...];

我曾经使用“accumarray”,但我使用了“mean”或“sum”函数,例如:

AprefCOR1 = accumarray(idx,AprefCOR,[],@mean).';

我只是想知道是否有一种方法可以使用它,但使用“prctile”函数或任何其他函数,可以为我提供特定元素的百分比,例如在这种情况下为“1”。

非常感谢。

4

3 回答 3

5

这可能是一种方法:

%// make all those non-zero values to zero
AprefCORmask = AprefCOR == 1;

%// you have done this
[OTPCORorder1,~,idx] = unique(OTPCORorder,'stable');

%// Find number of each unique values
counts = accumarray(idx,1);

%// Find number of ones for each unique value
sumVal = accumarray(idx,AprefCORmask);

%// find percentage of ones to get the results
perc = sumVal./counts

结果:

输入:

OTPCORorder = [61,62,62,62,62,62,62,62,62,62,62,62,65,65];
AprefCOR = [1,3,1,1,1,1,1,1,1,1,2,3,3,2];

输出:

perc =

1.0000
0.7273
     0
于 2015-06-04T05:57:03.537 回答
4

这是另一种不使用accumarray. 我认为它更具可读性:

>> list = unique(PCORorder);
>> counts_master = histc(PCORorder, list);
>> counts = histc(PCORorder(AprefCOR == 1), list);
>> perc = counts ./ counts_master

perc =

    1.0000    0.7273         0

上面的代码是如何工作的,我们首先找到其中的那些元素PCORorder是唯一的。PCORorder一旦我们这样做了,我们首先通过使用 bin 来计算有多少元素属于每个唯一值histc,作为这个确切的列表。如果您使用的是更新版本的 MATLAB,请histcounts改用...相同的语法。一旦我们找到 中每个值的元素总数PCORorder,我们只需计算与PCORorderwhere对应的元素数量AprefCOR == 1,然后计算百分比,您只需将此列表中的每个条目除以前一个列表中的元素总数。

它会给你相同的结果,accumarray但开销更少。

于 2015-06-04T06:01:54.733 回答
3

您的方法有效,您只需要定义一个适当的匿名函数accumarray. 让value = 1是您要计算其百分比的值。然后

[~, ~, u] = unique(OTPCORorder); %// labels for unique values in OTPCORorder
result = accumarray(u(:), AprefCOR(:), [], @(x) mean(x==value)).';

作为替代方案,您可以sparse按如下方式使用。生成一个两行矩阵,使得每一列对应于 中的一个可能值OTPCORorder。第一行记录了每个值在 中OTPCORorder具有所需值的次数AprefCOR;第二行记录了多少次没有。

[~, ~, u] = unique(OTPCORorder);
s = full(sparse((AprefCOR==value)+1, u, 1));
result = s(2,:)./sum(s,1);
于 2015-06-04T10:34:04.250 回答