2017-07-28 60 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的注意事项也适用。