2017-12-31 128 views
1

Unten ist ein Datenrahmen von vier Spalten, die Anforderung ist, dass ich für alle gängigen "a1" und "a2" Spaltenwertpaare die entsprechende aufsteigende Reihenfolge der a3 Spalten und setzen möchte die entsprechende Spalte a4 Werte in aufsteigender Reihenfolge. Z.B. Sehen Sie den Wert "A" und "M" in "a1" und "a2", wenn Sie die Reihenfolge der entsprechenden a3 Werte für "A" und "M" überprüfen, dh (10,32,13), möchte ich das entsprechende a4 Werte, die in der Reihenfolge angeordnet werden sollen (5,55,23) Ähnlich für alle ähnlichen Paare. Danke und bitte helfen Sie.Bedingtes Sortieren der Spalte in R

a1 = c("A", "B", "C", "A", "B", "B", "A", "C", "A", "C", "B") 
a2 = c("M", "O", "N" , "N", "O", "N", "M", "M", "M", "N", "O") 
a3 = c(10, 34, 35 , 56 , 44 , 37 , 32 , 15 , 13 , 12, 37) 
a4 = c(55, 6, 3, 213, 478, 233, 23, 14, 5, 7, 74) 
a123 = data.frame(a1, a2, a3, a4) 

Antwort

3

Hier ist eine dplyr Lösung den Rang/Reihenfolge der a3 Werte innerhalb jeder a1, a2 Kombination mit:

a1 = c("A", "B", "C", "A", "B", "B", "A", "C", "A", "C", "B") 
a2 = c("M", "O", "N" , "N", "O", "N", "M", "M", "M", "N", "O") 
a3 = c(10, 34, 35 , 56 , 44 , 37 , 32 , 15 , 13 , 12, 37) 
a4 = c(55, 6, 3, 213, 478, 233, 23, 14, 5, 7, 74) 

# datasets 
a123 = data.frame(a1, a2, a3) 
a124 = data.frame(a1, a2, a4) 

library(dplyr) 

# add the rank to each dataset 
# based on the order of the values in a3 and a4 
a123 = a123 %>% 
    group_by(a1,a2) %>% 
    mutate(r = rank(a3)) %>% 
    ungroup() 

a124 = a124 %>% 
    group_by(a1,a2) %>% 
    mutate(r = rank(a4)) %>% 
    ungroup() 

# join datasets based on a1, a2 combinations and the rank 
inner_join(a123, a124, by=c("a1","a2","r")) 

# # A tibble: 11 x 5 
# a1  a2  a3  r  a4 
# <fctr> <fctr> <dbl> <dbl> <dbl> 
# 1 A  M  10.0 1.00 5.00 
# 2 B  O  34.0 1.00 6.00 
# 3 C  N  35.0 2.00 7.00 
# 4 A  N  56.0 1.00 213 
# 5 B  O  44.0 3.00 478 
# 6 B  N  37.0 1.00 233 
# 7 A  M  32.0 3.00 55.0 
# 8 C  M  15.0 1.00 14.0 
# 9 A  M  13.0 2.00 23.0 
# 10 C  N  12.0 1.00 3.00 
# 11 B  O  37.0 2.00 74.0 

Sie können Spalte entfernen r wenn Sie möchten. Ich habe es dort gelassen, damit Sie leicht sehen können, wie es funktioniert.

Basierend auf den oben Philosophie/Ansatz, den Sie auch purrr und dplyr wie diese verwenden:

a1 = c("A", "B", "C", "A", "B", "B", "A", "C", "A", "C", "B") 
a2 = c("M", "O", "N" , "N", "O", "N", "M", "M", "M", "N", "O") 
a3 = c(10, 34, 35 , 56 , 44 , 37 , 32 , 15 , 13 , 12, 37) 
a4 = c(55, 6, 3, 213, 478, 233, 23, 14, 5, 7, 74) 

# datasets 
a123 = data.frame(a1, a2, v=a3) 
a124 = data.frame(a1, a2, v=a4) 

library(dplyr) 
library(purrr) 

list(a123, a124) %>% 
    map(. %>% 
     group_by(a1,a2) %>% 
     mutate(r = rank(v)) %>% 
     ungroup()) %>% 
    reduce(inner_join, by=c("a1","a2","r")) 

# # A tibble: 11 x 5 
# a1  a2  v.x  r v.y 
# <fctr> <fctr> <dbl> <dbl> <dbl> 
# 1 A  M  10.0 1.00 5.00 
# 2 B  O  34.0 1.00 6.00 
# 3 C  N  35.0 2.00 7.00 
# 4 A  N  56.0 1.00 213 
# 5 B  O  44.0 3.00 478 
# 6 B  N  37.0 1.00 233 
# 7 A  M  32.0 3.00 55.0 
# 8 C  M  15.0 1.00 14.0 
# 9 A  M  13.0 2.00 23.0 
# 10 C  N  12.0 1.00 3.00 
# 11 B  O  37.0 2.00 74.0 
+0

Danke, passt perfekt. –

0

Dies ist fast die gleiche wie Ihre vorherige Frage (Sorting a column based on the order of another column in R). Der Unterschied besteht darin, dass es zwei Gruppierungsvariablen gibt, a1 und a2. Glücklicherweise kann die Funktion group_by mehr als eine Spalte beanspruchen. Also die Lösung ist unten. Beachten Sie, dass ich ties.method = "first" eingestellt habe. Sie können dies in eine andere Bindungsmethode ändern, wenn Sie möchten, dass andere Regeln die Bindungen aufheben.

library(dplyr) 

a123_r <- a123 %>% 
    group_by(a1, a2) %>% 
    mutate(a4 = sort(a4, decreasing = TRUE)[rank(-a3, ties.method = "first")]) %>% 
    ungroup() %>% 
    as.data.frame() 
a123_r 
# a1 a2 a3 a4 
# 1 A M 10 5 
# 2 B O 34 6 
# 3 C N 35 7 
# 4 A N 56 213 
# 5 B O 44 478 
# 6 B N 37 233 
# 7 A M 32 55 
# 8 C M 15 14 
# 9 A M 13 23 
# 10 C N 12 3 
# 11 B O 37 74 
+0

Vielen Dank www für Ihre Hilfe, ich schätze Ihre Hilfe bei jeder Frage, wenn das gleiche wie vorher gewesen wäre, hätte ich es nie gefragt. –