2017-12-31 215 views
1

以下は4列のデータフレームです。すべての一般的な "a1"と "a2"列の値のペアに対して、a3列の対応する昇順を調べて、対応する列a4は昇順に値をとる。例えば。 "A"と "M"の対応するa3値の順番を確認すると、 "a1"と "a2"の値 "A"と "M"を参照してください。(10,32,13) (5,55,23)同様のすべての類似したペアについても同様です。ありがとう、助けてください。Rのカラムの条件付きソート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) 

答えて

3

ここで各a1a3値、a2組み合わせのランク/順序を使用してdplyrソリューションです:

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 

したい場合は、列rを削除することができます。私はそれをそこに残して、それがどのように機能するかを簡単に見ることができます。

あなたもこのような purrrdplyrを使用することができます上記の哲学/アプローチに基づいて

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

ありがとうございます。完璧にフィットします。 –

0

これはほとんどあなたの前の質問(Sorting a column based on the order of another column in R)と同じです。違いは、2つのグループ化変数、a1a2があることです。幸いにも、group_by関数は複数の列を取ることができます。その解決策は以下の通りです。私はties.method = "first"に設定されていることに注意してください。違うルールでネクタイを破りたい場合は、これを他のネクタイ方法に変更することができます。

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

お世話になりました、ありがとうございました。私はあなたのお手伝いをしてくれてありがとうございました。これは以前の質問と同じでした。 –