根据顺序对向量进行排名,并用其平均值替换关系

ali*_*cee 1 matlab r ranking

我是 R 的新手,我觉得它很有趣。

我有 MATLAB 代码来根据顺序对向量进行排名,效果很好。现在我想将其转换为 R 代码,这是一个典型的矛兵排名:

# MATLAB CODE

function r=drank(x)

u = unique(x);
[xs,z1] = sort(x);
[z1,z2] = sort(z1);
r = (1:length(x))';
r=r(z2);

for i=1:length(u)

    s=find(u(i)==x);

    r(s,1) = mean(r(s));

end
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

# R CODE

x = c(10.5, 8.2, 11.3, 9.1, 13.0, 11.3, 8.2, 10.1)

drank <- function(x){

    u = unique(x)
    xs = order(x)
    r=r[xs]

    for(i in 1:length(u)){
        s=which(u[i]==x)
        r[i] = mean(r[s])  
    }

    return(r)
}
Run Code Online (Sandbox Code Playgroud)

r <- 喝了(x)

结果:

r = 5, 1.5, 6.5, 3, 8, 6.5, 1.5, 4
Run Code Online (Sandbox Code Playgroud)

1.58.2是出现两次的平均值,即。领带

6.511.3是出现两次的平均值

谁能帮我检查一下吗?

谢谢,

And*_*rie 5

R 有一个内置的排名函数,称为rank(),它准确地给出了您正在寻找的内容。rank具有参数ties.method“指定如何处理关系的字符串”,默认为"average",即用其平均值替换关系。

x = c(10.5, 8.2, 11.3, 9.1, 13.0, 11.3, 8.2, 10.1)
expected <- c(5, 1.5, 6.5, 3, 8, 6.5, 1.5, 4)

rank(x)
# [1] 5.0 1.5 6.5 3.0 8.0 6.5 1.5 4.0

identical(expected, rank(x))
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)