2015-09-22 8 views
9

Betrachten Sie den folgenden vorsortierten Vektor x.Umkehren der Reihenfolge duplizierter Abschnitte in einem Vektor

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

order() zeigt uns die Reihenfolge des Vektors.

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

Jetzt nehme ich die Reihenfolge der nur den duplizierten/wiederholt Werte von x umkehren wollen, was bedeutet, ich nur die 2 3 4 und 7 8 9 Abschnitte von o umkehren wollen, weil diejenigen, die Werte wiederholt in x sind. Dann würde das gewünschte Ergebnis

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

sein Was ist der beste Weg, das zu tun? Im Moment habe ich die folgenden

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

Aber das gibt nicht die richtige Antwort hier.

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

PS - Ich verwende dies, um die Spaltenreihenfolge der doppelten Spaltennamen umzukehren.

+0

Ist der Vektor 'X' immer davon ausgegangen bestellt werden, mit zu beginnen, oder wäre eine Lösung haben für ungeordnete 'x's zu verallgemeinern? Zum Beispiel, was ist dein Wunschergebnis für 'x <- c (1,3,5,2,7,2,7,2,7,8)'? – aashanand

+0

Runde von Golf jedermann? 'rev (order (-x))' – rawr

Antwort

15

Mit data.table v1.9.6:

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 

Alternativ können Sie tun:

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

(nicht ganz sicher, ob es Fälle gibt, in denen diese brechen könnte)

+3

Wie um alles in der Welt bist du mit dem 'runif() 'one? Das ist beeindruckend. –

+1

Der 'rifif()' ist ein wirklich beeindruckender schneller und schmutziger Trick. – aashanand

+1

Der 'runf' wird funktionieren, wenn Sie einen ganzzahligen Vektor haben (wie Richard das Problem macht), aber ich denke, er könnte den Vektor falsch anordnen, wenn die Lücken zwischen Elementen kleiner als 1 sind. – josliber

12

eine Basis R 1-Liner würde ave verwenden, um die Sortierung durch eindeutige Werte in der o gruppieren riginal Vektor, rev Anlegen der Bestellung für jede Gruppe zu umkehren:

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

Sehr cool zu sehen, dass ave() wie apply() verwendet wird. – aashanand

Verwandte Themen