按列重复自定义数据框排序

时间:2017-07-28 18:52:33

标签: r sorting dataframe

我想寻求帮助,因为我在订购我的表时遇到了困难,因为要订购的表的列有重复项(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)

一些失败的尝试

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

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

您的数据样本表明您所需的排序顺序与第coltoorder列中的第一次出现相同。

如果这是真的,来自Hadley Wickham的fct_inorder()包的函数forcats在这里可能特别有用:

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