2017-07-28 7 views
0

注文するテーブルの列に重複(coltoorder)があるため、私はテーブルを注文するのが難しいため、助けを求めていました。これは私のテーブルの小さな部分です。希望の順序はカスタムです。おおまかに言えば、最初の値(887)を除いて、最初の列の順序に基づいています。データフレームの重複によるカスタム並べ替え

myindex<-c(887,895,888,1018,896) # equivalent to 
myindex2<-c(887,887,895,895,888,888,1018,1018,896,896) 

text<-"col1 col2 col3 coltoorder 
895  2 1374 887 
888  2  14 887 
1018 3 1065 895 
896  2  307 895 
889  2  4 888 
891  2  8 888 
1055 2  971 1018 
926  3  241 896 
1021 2  87 1018 
897  2  64 896" 
mytable<-read.table(text=text, header = T) 
mytable 

所望の順序は、いくつかはcoltoorderがない数値、一概に扱われるべきであるように思えattemps

try1<-mytable[match(myindex, mytable$coltoorder),] 
try2<-mytable[match(myindex2, mytable$coltoorder),] 
try3<-mytable[mytable$coltoorder %in% myindex,] 
try3<-mytable[myindex %in% mytable$coltoorder,] 
try4<-mytable[myindex2 %in% mytable$coltoorder,] 
rownames(mytable) <- mytable$coltoorder # error 
+1

ソート順の説明はあまり明確ではありません。 –

答えて

2

に失敗しました。すべての要素にはレベルのオーダがありますので、レベルがmyindexに基づいて並べ替えられた要素に変換されます。その後、この注文は列に焼き付けられ、通常はorderを使用することができます。

mytable$coltoorder = factor(mytable$coltoorder, levels = myindex) 
mytable[order(mytable$coltoorder), ] 
#  col1 col2 col3 coltoorder 
# 8 895 2 1374  887 
# 1 888 2 14  887 
# 131 1018 3 1065  895 
# 9 896 2 307  895 
# 2 889 2 4  888 
# 4 891 2 8  888 
# 168 1055 2 971  1018 
# 134 1021 2 87  1018 
# 39 926 3 241  896 
# 10 897 2 64  896 

は気をつけてください - このコラムは、今 factorない numericです。係数から数値を復元する場合は、文字で変換する必要があります。 original_values = as.numeric(as.character(mytable$coltoorder))

0

データサンプルでは、​​希望の並べ替え順序が列coltoorderの最初の表示に相当することが示唆されています。これは trueの場合

、ハドレーウィッカムのforcatsパッケージから機能fct_inorder()はここに役立ち、特定のことがあります

mytable$coltoorder <- forcats::fct_inorder(as.character(mytable$coltoorder)) 
mytable[order(mytable$coltoorder), ] 
    col1 col2 col3 coltoorder 
1 895 2 1374  887 
2 888 2 14  887 
3 1018 3 1065  895 
4 896 2 307  895 
5 889 2 4  888 
6 891 2 8  888 
7 1055 2 971  1018 
9 1021 2 87  1018 
8 926 3 241  896 
10 897 2 64  896 

fct_inorder()並べ替えるには、初登場でレベルが要因。したがって、別のベクトルを作成する必要はありません。myindex

ただし、Gregor's answerの警告も適用されます。

関連する問題