13

假设我们有一个向量foo,我们必须临时置换它(排序或重新排序),在它的基础上计算一些向量,bar最后置换回原来的顺序- 这意味着逆置换:foobarfoo

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 回答