2017-12-30 27 views
1

以下のRスクリプトは、3つの列を持つデータフレームa123を作成します。列a1は、対応するa2およびa3値を有する異なる場所で発生する3つの変数を有する。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) 

私の必要条件は、a1の値に対応するa3の列の値を、a2の値の順序に基づいて昇順に並べ替えることです。また、共通のa2値に遭遇した場合、対応するa3列の値は昇順に並べる必要があります。例えば、

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

値をすることができ、列A1の値 "A" はA2とA3の値を以下ましたと言うように:

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

期待される成果:

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) 

ありがとうございました。 注:大きなデータに基づいて計算が遅くなる可能性があるので、ループや条件を避けてください。

+1

「85 23 123 55」はあなたの例ですか?あなたのロジックが何であるかは私には明らかではありません。 – Psidom

+0

昨日同じ質問を投稿しました:https://stackoverflow.com/questions/48023937/sorting-the-values-of-column-in-ascending-order-in-r ...しかし、正直にあなたはしていませんでしたあなたの要求の効果をより良く... –

+0

tapply()とorder()関数を見てください。 – user2554330

答えて

1

dplyr,sortおよびrankを用いた溶液。私はあなたのロジックを完全に理解していませんが、これはおそらくあなたが探しているものです。グループAa3の要素が123, 55, 85, 23であると仮定しています。

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

完了しました。 –

関連する問題