2017-07-28 63 views
0

我想要求幫助,因爲訂購表的列有重複項(coltoorder),所以我在訂購我的表時遇到困難。這是我桌子上的一小部分。所需的順序是自定義的,大致來說,它是基於第一列的順序,除了第一個值(887)。按列重複自定義排序數據框

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 

所需的順序

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

一些失敗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

好像coltoorder應該斷然處理,而不是數字。所有因素都有其級別的順序,所以我們將根據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列中的第一次出現。

如果這是真的,從哈德利韋翰的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的注意事項也適用。