2017-12-29 23 views
0

Das folgende Skript ist ein Datenrahmen aus drei Spalten. Mein Bedürfnis ist, dass ich ein Paar Werte (a1, a2) auf einmal nehmen möchte. Wenn in der Tabelle ein Duplikat des Paares vorhanden ist, möchte ich die entsprechenden a3-Werte in einer absteigenden Reihenfolge anordnen. Zur Veranschaulichung, erstes (a1, a2) Wertepaar ist ("A", "D"), wir sehen, dass sie wieder an der 4. und 7. Stelle auftreten. Also möchte ich, dass das Paar hier mit jeder Zeile verglichen wird, und nachdem die 4. und 7. gefunden wurden, werden die entsprechenden "a3" -Werte in aufsteigender Reihenfolge angeordnet, ähnlich für alle Zeilenpaare. Bitte versuchen Sie, Schleifen zu vermeiden, und wenn es den Prozess verlangsamen könnte. Ich habe versucht mit "arrangieren", aber keine Hilfe. Danke und bitte schlagen Sie vor.Anordnen der Spaltenwerte in R basierend auf ähnlichen Paaren in Daten

a1 = c("A","B","C","A","B","C","A") 
a2 = c("D","E","F","D","F","E","D") 
a3 = c(20,40,50,5,15,35,10) 
a123= data.frame(a1,a2,a3) 
View(a123) 

erwartetes Ergebnis

a1 = c("A","B","C","A","B","C","A") 
a2 = c("D","E","F","D","F","E","D") 
a3 = c(5,40,50,10,15,35,20) 
a123 = data.frame(a1,a2,a3) 

Antwort

0

Wir können Gruppe die Daten von a1 und a2 und dann mutate und sort verwenden, um die Zahlen in a3 neu zu ordnen. a123_r ist die endgültige Ausgabe.

library(dplyr) 

a123_r <- a123 %>% 
    group_by(a1, a2) %>% 
    mutate(a3 = sort(a3)) %>% 
    ungroup() 
a123_r 

# # A tibble: 7 x 3 
# a1  a2  a3 
# <fctr> <fctr> <dbl> 
# 1 A  D  5.00 
# 2 B  E  40.0 
# 3 C  F  50.0 
# 4 A  D  10.0 
# 5 B  F  15.0 
# 6 C  E  35.0 
# 7 A  D  20.0 
+0

Vielen Dank Sir für Ihre Mühe, passt perfekt, aber als ich an meinem Problem arbeite, bin ich auf eine extra Spalte in den zu filternden Daten gestossen, in der ich Hilfe benötige, sollte ich die obige Anforderung hinzufügen? –

+0

Bitte stellen Sie eine neue Frage, da diese Frage abgeschlossen ist. – www

+0

Sicher, wie Sie vorgeschlagen haben, habe ich eine neue Frage mit Addon-Anforderung erstellt, würde sich über Ihre Hilfe auf dem gleichen freuen. https://stackoverflow.com/questions/48023937/sorting-the-values-of-column-in-ascending-order-in-r –

0

würde ich auf eine andere Spalte fügen Sie sie nur einen Schlüssel zu erstellen.

a4 = paste(a1,a2) 
a123 = cbind(a123,a4) 
a123[order(a123$a4,a123$a3),] 
# a1 a2 a3 a4 
#4 A D 5 A D 
#7 A D 10 A D 
#1 A D 20 A D 
#2 B E 40 B E 
#5 B F 15 B F 
#6 C E 35 C E 
#3 C F 50 C F 
# or save the new order 
a123 = a123[order(a123$a4,a123$a3),] 
+0

Vielen Dank Dror für die Antwort, nach meinem Bedarf, ich habe für die Spalte a3 Werte aufgefordert, in aufsteigender Reihenfolge nur für diese Paare in a1 und a2 w zu ändern Wenn Duplikate in den Daten vorhanden sind, sollte keine Änderung an a1, a2 Spalten vorgenommen werden. Bitte schlagen Sie vor. –

+0

bitte überprüfen Sie für die Ausgabe, die ich in die Frage oben gestellt habe, könnte es hilfreich sein. –

0

Aus Gründen der Vollständigkeit, hier ist auch eine data.table Lösung, die a3 durch Bezugnahme nur Spalte aktualisiert, dh ohne das Kopieren des gesamten Datenobjekt a123:

library(data.table) 
setDT(a123)[, a3 := sort(a3), by = .(a1, a2)][] 
a1 a2 a3 
1: A D 5 
2: B E 40 
3: C F 50 
4: A D 10 
5: B F 15 
6: C E 35 
7: A D 20 
Verwandte Themen