根据列中的名称对数据框行进行排序

时间:2016-03-24 10:55:59

标签: r

我需要根据DF列中的相应名称对数据框(DF)中的行重新排序。 我的DF看起来像这样

beta    se       hr    m
0.1     0.01     1     xl.vl.pl
0.2     0.02     2     l.vl.ce
0.3     0.03     3     s.vl.fc
0.4     0.04     4     idl.p
0.1     0.01     1     m.vl.pl
0.2     0.02     2     xs.vl.ce
0.3     0.03     3     l.vl.fc
0.4     0.04     4     idl.p
0.4     0.04     4     xxl.vl.pl

我想根据专栏m重新排序,以便

0.4     0.04     4     xxl.vl.pl
0.1     0.01     1     xl.vl.pl
0.2     0.02     2     l.vl.ce
0.3     0.03     3     l.vl.fc
0.1     0.01     1     m.vl.pl
0.4     0.04     4     idl.p
0.4     0.04     4     idl.p
0.3     0.03     3     s.vl.fc
0.2     0.02     2     xs.vl.ce

我感谢任何帮助和建议。

2 个答案:

答案 0 :(得分:5)

您可以使用与m的第一部分相对应的有序因子(您可以通过拨打sub来检索),根据您的意愿(xxl, xl, l, m, idl ,s, xs)订购,然后您可以订购data.frame使用它:

DF[order(factor(sub("([^.]+)\\..+", "\\1", DF$m), 
   levels=c("xxl", "xl", "l", "m", "idl" ,"s", "xs"), ordered=TRUE)), ]

 # beta   se hr         m
# 9  0.4 0.04  4 xxl.vl.pl
# 1  0.1 0.01  1  xl.vl.pl
# 2  0.2 0.02  2   l.vl.ce
# 7  0.3 0.03  3   l.vl.fc
# 5  0.1 0.01  1   m.vl.pl
# 4  0.4 0.04  4     idl.p
# 8  0.4 0.04  4     idl.p
# 3  0.3 0.03  3   s.vl.fc
# 6  0.2 0.02  2  xs.vl.ce

答案 1 :(得分:0)

orderLevels<-c("xxl","xl","l","m","idl","s","xs")

library(dplyr)
DF<-DF %>% mutate(m2 = match(sapply(strsplit(DF$m, "[.]"), function(x) x[1]), orderLevels)) %>% arrange(m2) %>% select(-m2)