R的排名和顺序

时间:2012-09-05 20:26:18

标签: r sorting

我无法理解R函数rank和R函数order之间的区别。它们似乎产生相同的输出:

> rank(c(10,30,20,50,40))
[1] 1 3 2 5 4
> order(c(10,30,20,50,40))
[1] 1 3 2 5 4

有人可以为我阐明这一点吗? 谢谢

7 个答案:

答案 0 :(得分:60)

> set.seed(1)
> x <- sample(1:50, 30)    
> x
 [1] 14 19 28 43 10 41 42 29 27  3  9  7 44 15 48 18 25 33 13 34 47 39 49  4 30 46  1 40 20  8
> rank(x)
 [1]  9 12 16 25  7 23 24 17 15  2  6  4 26 10 29 11 14 19  8 20 28 21 30  3 18 27  1 22 13  5
> order(x)
 [1] 27 10 24 12 30 11  5 19  1 14 16  2 29 17  9  3  8 25 18 20 22 28  6  7  4 13 26 21 15 23

rank返回每个值的“rank”的向量。第一个位置的数字是第9个最低位。 order返回将初始向量x按顺序排列的索引。

x的第27个值是最低的,因此27order(x)的第一个元素 - 如果你看rank(x),第27个元素是{{ 1}}。

1

答案 1 :(得分:9)

我总是觉得考虑两者之间的区别让人感到困惑,我一直认为,“我怎样才能使用orderrank”?

从贾斯汀的例子开始:

使用等级排序:

## Setup example to match Justin's example
set.seed(1)
x <- sample(1:50, 30) 

## Make a vector to store the sorted x values
xx = integer(length(x))

## i is the index, ir is the ith "rank" value
i = 0
for(ir in rank(x)){
    i = i + 1
    xx[ir] = x[i]
}

all(xx==x[order(x)])
[1] TRUE

答案 2 :(得分:6)

rank更复杂,不一定是索引(整数):

> rank(c(1))
[1] 1
> rank(c(1,1))
[1] 1.5 1.5
> rank(c(1,1,1))
[1] 2 2 2
> rank(c(1,1,1,1))
[1] 2.5 2.5 2.5 2.5

答案 3 :(得分:4)

事实证明这是一个特例,让事情变得混乱。我在下面解释任何感兴趣的人:

rank返回升序列表中每个元素的顺序

order返回每个元素在升序列表中的索引

答案 4 :(得分:1)

如R提示中的?order()所述, order只返回一个排列,它将原始向量按升序/降序排序。 假设我们有一个向量

A<-c(1,4,3,6,7,4);
A.sort<-sort(A);

然后

order(A) == match(A.sort,A);
rank(A) == match(A,A.sort);

此外,我发现订单具有以下属性(未经过有效验证):

1 order(A)∈(1,length(A))
2 order(order(order(....order(A)....))):if you take the order of A in odds number of times, the results remains the same, so as to even number of times.

答案 5 :(得分:1)

在外行人的语言中,order在排序值后给出值的实际位置/位置 例如:

a<-c(3,4,2,7,8,5,1,6)
sort(a) [1] 1 2 3 4 5 6 7 8

1a的位置为7. 2a的位置类似于3. {/ p>

order(a) [1] 7 3 1 2 6 8 4 5

答案 6 :(得分:0)

一些观察:

// Recommendation: assign Text here in the inspector
public Text textToScale;
public float halfDuration = 0.5f;    
public float bigScaleMultiplier = 1.5f;

private Coroutine effectCoroutine = null;
private Vector3 scaleStart;

// call this to begin the effect
public void StartEffect()
{
    // ensure duplicates don't run
    if (effectCoroutine == null)
    {
        effectCoroutine = StartCoroutine(DoEffect());
    }
}

private IEnumerator DoEffect()
{
    float elapsedPortion = 0f;
    scaleStart = textToScale.rectTransform.localScale;
    float scaleMultiplierIncrease = bigScaleMultiplier - 1f;

    while (elapsedPortion < 2f)
    {
        // t = What fraction of "big" we are currently at
        float t = Mathf.PingPong(elapsedPortion, 1f);

        float curScaleMultiplier = 1f + scaleMultiplierIncrease * t;

        textToScale.rectTransform.localScale = curScaleMultiplier * scaleStart;
        yield return null;
        elapsedPortion += Time.deltaTime / halfDuration;
    }

    textToScale.rectTransform.localScale = scaleStart;
    effectCoroutine = null;
}