根据R中的列数据定制排序

时间:2015-08-28 06:04:08

标签: r sorting

我有一个csv文件,需要按列排序。然而,订单来自order.cfg文件。 eg.my df看起来像这样

C1,C2,C3
A, 51,60
B, 91,10
M, 31,56
Z, 34,20

现在如果order.cfg如下所示

M
Z

然后df应按照向上推M和Z的方式进行排序

C1,C2,C3
M, 31,56
Z, 34,20
A, 51,60
B, 91,10

我知道如何根据列值进行排序,但这里需要通过我的可配置order.cfg来完成。

我的一个天真的方法是在df中逐个grep每个元素。

  1. grep M in df $ C1在newdf中删除该行并从df中删除
  2. rbind newdf,其余为df
  3. 然而,必须有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:1)

我在数据框中读到这些内容,' df1'和' order.cfg',其中stringsAsFactors = FALSE。然后,这将提供所需的顺序:

[{"code":"I77.812","description":"Thoracoabdominal Aortic Ectasia"}]
[{"code":"I77.811","description":"Abdominal Aortic Ectasia"},{"code":"I77.811","description":"Abdominal Aortic Ectasia"}]
[{"code":"I06.1","description":"Rheumatic aortic insufficiency"},{"code":"I06.1","description":"Rheumatic aortic insufficiency"},{"code":"I06.1","description":"Rheumatic aortic insufficiency"}]

答案 1 :(得分:0)

如果order.cfg数据被视为具有两个元素的vector(' v1')(' M',' Z&#39 ;),我们改变了C1'专栏' df1'通过连接(factor)' C1'中常见的元素,指定levelsc类。和' v1' (intersect(df1$C1, v1)),然后是' C1'中存在的元素。而不是在' v1' (setdiff(df1$C1, v1)),order并将其用作索引以重新排序' df1'的行。

df2 <- df1[order(factor(df1$C1, levels=c(intersect(df1$C1,v1),
                                               setdiff(df1$C1, v1)))),]
row.names(df2) <- NULL
df2
#  C1 C2 C3
#1  M 31 56
#2  Z 34 20
#3  A 51 60
#4  B 91 10

数据

v1 <- c('M', 'Z')

df1 <- structure(list(C1 = c("A", "B", "M", "Z"), C2 = c(51L, 91L, 31L, 
34L), C3 = c(60L, 10L, 56L, 20L)), .Names = c("C1", "C2", "C3"
), class = "data.frame", row.names = c(NA, -4L))