2015-09-22 12 views
9

次の事前ソートベクトルxを考えてみましょう。ベクトルの重複セクションの順序を逆にする

x <- c(1, 2, 2, 2, 3, 5, 7, 7, 7, 8) 

order()は、ベクターの順序を示す。

(o <- order(x)) 
# [1] 1 2 3 4 5 6 7 8 9 10 

は今、私はそれらがxに繰り返される値であるためoのちょうど2 3 47 8 9セクションを逆にするという意味、xの唯一の重複/繰り返される値の順序を逆にするとします。その後、所望の結果が

[1] 1 4 3 2 5 6 9 8 7 10 

それを行うための最善の方法は何でしょうか?今すぐ私は以下を持っています

w <- which(duplicated(x) | duplicated(x, fromLast = TRUE)) 
o[w] <- rev(o[w]) 

しかし、ここでは正しい答えはありません。

o 
# [1] 1 9 8 7 5 6 4 3 2 10 

PS - 重複する列名の列の順序を逆にするために使用しています。 data.table v1.9.6使用

+0

は常にで始まるように注文するか、ソリューションが順不同 'x'sのために一般化しなければならないと仮定X 'のベクトル'ですか?例えば、 'x < - c(1,3,5,2,7,2,7,2,7,8)'の結果は何ですか? – aashanand

+0

誰のゴルフ? 'rev(order(-x))' – rawr

答えて

15

require(data.table) 
as.data.table(x)[, .(id = rev(.I)), by=x] 
#  x id 
# 1: 1 1 
# 2: 2 4 
# 3: 2 3 
# 4: 2 2 
# 5: 3 5 
# 6: 5 6 
# 7: 7 9 
# 8: 7 8 
# 9: 7 7 
# 10: 8 10 

また、あなたが行うことができます:

order(x + sort(runif(length(x)), dec=TRUE)) 
# [1] 1 4 3 2 5 6 9 8 7 10 

(完全にわからない、これが壊れる可能性例がある場合)

+3

あなたは 'runif()'をどうやって作りましたか?それが印象的です。 –

+1

'runif()'は本当に印象的な素早く汚れたトリックです。 – aashanand

+1

整数値のベクトル(リチャードが問題にしている)がある場合、 'runif'は動作しますが、要素間のギャップが1より小さい場合、ベクトルのミスオーダーが起こることがあります。 – josliber

12

ベースRを1ライナーはaveを使用して、o riginalベクトル、グループごとに順序を逆にするrevを適用する:

ave(order(x), x, FUN=rev) 
# [1] 1 4 3 2 5 6 9 8 7 10 
+1

ave()がapply()のように使われているのを見るのがとても涼しいです。 – aashanand

関連する問題