Подтвердить что ты не робот

Создание обратной подстановки

Предположим, нам задан вектор 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

И здесь должен идти ваш ответ, так что у нас есть следующие требуемые конечные значения:

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

Как это сделать?

Пожалуйста, просто не отвечайте: "вы могли бы сделать bar = 2 * foo и не переставлять его". Это простой пример. В некоторых ситуациях нам нужно сортировать foo для эффективности (быстрый поиск по нему) или что-то в этом роде.

4b9b3361

Ответ 1

Это будет работать, потому что [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

Ответ 2

Чтобы восстановить исходный порядок, используйте order(o):

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