2016-10-05 3 views
4

Пусть у меня есть векторR: отменить заказ/Unsort/вернуться к начальному заказу

test<-c("a","b","c","d","e")

Я меняю порядок, используя другой вектор индексов (это очень важно):

sortvect<-c(2,3,5,4,1) 
test2<-test[sortvect] 

после этого я сделать некоторые операции на test2 и после того, что я хочу, чтобы вернуться к исходному порядку, имея sortvect:

test<-give_my_order_back(test2,sortvect)

Я пробовал test2[sortvect] и test2[rev(sortvect)], но решение, по-видимому, отличается.

+0

@ZheyuanLi Спасибо! Кажется, что 'test2 [match (test, test2)]' сделал трюк – Slowpoke

ответ

5

Это не так уж сложно. match(test, test2) предоставит вам индекс для переупорядочения назад.

test <- c("a","b","c","d","e") 
sortvect <- c(2,3,5,4,1) 
test2 <- test[sortvect] 
sortback <- match(test, test2) 
test2[sortback] 
# [1] "a" "b" "c" "d" "e" 
+0

Это не будет работать, если значения в 'test2' изменились между – HubertL

+0

@HubertL @ZheyuanLi. Я совпадал (c (1,2,3 , 4,5), sortvect) 'для моих целей – Slowpoke

+1

@ZheyuanLi Я только что заметил, что подход с' match() 'потенциально дает большие возможности (впрочем, в настоящее время они мне не нужны): можно отбросить назад порядок на определенном этапе, например если бы два порядка были применены последовательно: 'sortvect1' и' sortvect2' – Slowpoke

4

В качестве альтернативы order может также сделать это довольно просто

test2[order(sortvect)] 
# [1] "a" "b" "c" "d" "e" 
2

Как отметил DWW, чтобы изменить порядок, просто использовать order по индексу, который вы использовали для deordering:

test <- c("a","b","c","d","e") 
sortvect <- c(2,3,5,4,1) 
test2 <- test[sortvect] 
test2[order(sortvect)] 
[1] "a" "b" "c" "d" "e" 

это позволяет вернуться к первоначальному заказу, даже если вы изменили объект между ними:

test <- c("a","b","c","d","e") 
sortvect <- c(2,3,5,4,1) 
test2 <- test[sortvect] 
set.seed(12) 
test2 <- paste0(sample(c("a","b","c","d","e"), 5, replace = F),test2) 
test2[order(sortvect)] 
[1] "ba" "ab" "dc" "ed" "ce" 
Смежные вопросы