我想寻求帮助,因为我在订购我的表时遇到了困难,因为要订购的表的列有重复项(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
答案 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的注意事项也适用。