Ali*_*Ali 13 r vector permutation
假设我们给出一个载体foo,我们不得不暂时置换它(排序或重新排序的话),可以计算部分向量bar它的基础上,终于回到置换双方foo和bar对原有秩序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
Run Code Online (Sandbox Code Playgroud)
这里应该回答你的问题,以便我们得到以下所需的最终值:
foo == 1 7 3 5 2
bar == 2 14 6 10 4
Run Code Online (Sandbox Code Playgroud)
这该怎么做?
请简单地回答:"你可以做bar = 2 * foo而不是置换它".这只是一个简单的例子.在某些情况下,我们必须foo对效率进行排序(快速搜索它)或类似的东西.
Jos*_*ien 13
这将起作用,因为[order(o)]反转了以下的动作[o]:
foo <- c(1, 7, 3, 5, 2)
o <- order(foo)
(foo[o]*2)[order(o)]
# [1] 2 14 6 10 4
Run Code Online (Sandbox Code Playgroud)
为了表明它更常用:
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
Run Code Online (Sandbox Code Playgroud)
要恢复原始订单,请使用order(o):
> (foo[o]*2)[order(o)]
[1] 2 14 6 10 4
Run Code Online (Sandbox Code Playgroud)