2017-12-30 4 views
1

Das folgende R-Skript erstellt einen Datenrahmen a123 mit drei Spalten. Spalte a1 hat drei Variablen, die an verschiedenen Stellen mit entsprechenden a2- und a3-Werten auftreten.Sortieren einer Spalte in der Reihenfolge einer anderen Spalte in R

a1 = c("A", "B", "C", "A", "B", "B", "A", "C", "A", "C", "B") 
a2 = c(10, 8, 11 , 6 , 4 , 7 , 9 , 1 , 3 , 2, 7) 
a3 = c(55, 34, 33, 23, 78, 33, 123, 34, 85, 76, 74) 
a123 = data.frame(a1, a2, a3) 

Mein Bedürfnis ist, dass ich A3 Spaltenwerte entsprechend a1 Spaltenwert will in aufsteigender Reihenfolge angeordnet werden, basierend auf der Reihenfolge von a2 Werten. Wenn gemeinsame a2-Werte auftreten, sollten die entsprechenden a3-Spaltenwerte in aufsteigender Reihenfolge angeordnet sein. Zum Beispiel, sagen Wert "A" in Spalte a1 hat Werte in a2 und a3 folgenden,

a2 = c(10, 6, 9, 3) 
a3 = c(55, 23, 123, 85) 

Die Werte können wie:

a3 = c(123, 23, 85, 55) 

Erwartete Ergebnisse:

a1 = c("A", "B", "C", "A", "B", "B", "A", "C", "A", "C", "B") 
a2 = c(10, 8, 11, 6, 4, 7, 9, 1, 3, 2, 7) 
a3 = c(123, 78, 76, 23, 33, 34, 85, 33, 55, 34, 74) 
a123 = data.frame(a1, a2, a3) 

Danke und bitte helfen. Hinweis: Versuchen Sie, Schleifen und Bedingungen zu vermeiden, da sie die Berechnung aufgrund großer Datenmengen verlangsamen können.

+1

Meinten Sie '85 23 123 55' für Ihr Beispiel? Es ist mir nicht ganz klar, was deine Logik ist. – Psidom

+0

Gestern haben Sie die gleiche Frage gestellt: https://stackoverflow.com/questions/48023937/sorting-the-values-of-column-in-ascending-order-in-r ... aber ehrlich gesagt haben Sie nicht besser die Wirksamkeit Ihrer Anfrage ... –

+0

Schauen Sie sich die Funktionen tapply() und order() an. – user2554330

Antwort

1

Eine Lösung mit dplyr, sort und rank. Ich verstehe deine Logik nicht vollständig, aber das ist wahrscheinlich etwas, wonach du suchst. Beachten Sie, dass ich davon ausgehe, dass die Elemente in a3 der Gruppe A123, 55, 85, 23 sind.

library(dplyr) 

a123_r <- a123 %>% 
    group_by(a1) %>% 
    mutate(a3 = sort(a3, decreasing = TRUE)[rank(-a2, ties.method = "last")]) %>% 
    ungroup() %>% 
    as.data.frame() 
a123_r 
# a1 a2 a3 
# 1 A 10 123 
# 2 B 8 78 
# 3 C 11 76 
# 4 A 6 55 
# 5 B 4 33 
# 6 B 7 34 
# 7 A 9 85 
# 8 C 1 33 
# 9 A 3 23 
# 10 C 2 34 
# 11 B 7 74 
+0

Fertig, nochmals vielen Dank für die Mühe. –

Verwandte Themen