R:撤消排序/取消排序/切换回初始顺序

时间:2016-10-05 21:48:14

标签: r sorting

假设我有一个向量

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)],但解决方案明显不同。

4 个答案:

答案 0 :(得分:6)

这并不困难。 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"

答案 1 :(得分:5)

或者order也可以非常简单地执行此操作

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

答案 2 :(得分:2)

正如dww所指出的,要反转排序,只需使用用于排序的索引的顺序: 测试&lt; -c(&#34; a&#34;,&#34; b&#34;,&#34; c&#34;,&#34; d&#34;,&#34; e&#34; ) sortvect&lt; - c(2,3,5,4,1) test2&lt; - test [sortvect] TEST2 [顺序(sortvect)] [1]&#34; a&#34; &#34; B&#34; &#34; C&#34; &#34; d&#34; &#34; E&#34; 这允许您返回原始顺序,即使您在其间修改了对象: 测试&lt; -c(&#34; a&#34;,&#34; b&#34;,&#34; c&#34;,&#34; d&#34;,&#34; e&#34; ) sortvect&lt; - c(2,3,5,4,1) test2&lt; - test [sortvect] set.seed(12) test2&lt; - paste0(样本(c(&#34; a&#34;,&#34; b&#34;,&#34; c&#34;,&#34; d&#34;,&#34; e&#34;),5,replace = F),test2) TEST2 [顺序(sortvect)] [1]&#34; ba&#34; &#34; AB&#34; &#34; DC&#34; &#34; ED&#34; &#34; CE&#34;

答案 3 :(得分:0)

您可以使用rank()计算逆排列,而不是 sort(sort(x))。相同的计算。

> test[order(sortvect)][rank(sortvect)]
[1] "a" "b" "c" "d" "e"

通常具有以下身份:

set.seed(0)
x<-matrix(rnorm(100),1)

all(order(order(x))==rank(x))
all(x==x[order(x)][rank(x)])