13

ベクトルが与えられ、それfooを一時的に並べ替え (並べ替えまたは並べ替え)、それに基づいてベクトルを計算bar、最終的に両方foobar元の順序に並べ替える必要がfooあるとします。つまり、逆順列を意味します。

foo <- c(1, 7, 3, 5, 2)
o <- order(foo)
foo <- foo[o] # Now foo is permuted, and sorted: foo == 1 2 3 5 7
bar = 2 * foo # bar == 2 4 6 10 14

そして、以下の望ましい最終値が得られるように、ここに答えを入力する必要があります。

foo == 1 7 3 5 2
bar == 2 14 6 10 4

これを行う方法?

単純に、「変更はできますが、変更はできません」と返信しないでくださいbar = 2 * foo。これは簡単な例です。場合によっては、効率のために並べ替えfoo(クイック検索) などを行う必要があります。

4

2 に答える 2

14

[order(o)]のアクションを反転するため、これは機能します。[o]

foo <- c(1, 7, 3, 5, 2)
o <- order(foo)

(foo[o]*2)[order(o)]
# [1]  2 14  6 10  4

より一般的に機能することを示すには:

testAlgorithm <- function(foo) {
    o <- order(foo)
    identical(foo, foo[o][order(o)])
}

x <- c(1, 7, 3, 5, 2)
y <- c(1,2,5,7,4, 99, 88, 3, 0)
z <- sample(1000)                  ## (No ties)
zz <- sample(1000, replace=TRUE)   ## (Many ties)
all(sapply(list(x,y,z,zz), testAlgorithm))
[1] TRUE
于 2013-01-04T00:12:31.340 に答える
8

元の順序に戻すには、次を使用しますorder(o)

> (foo[o]*2)[order(o)]
[1]  2 14  6 10  4
于 2013-01-03T23:44:32.563 に答える