按递增和递减顺序逐列排序数据

时间:2013-04-25 02:05:00

标签: r dataframe

我正在试图弄清楚如何按顺序对数据框进行排序,如c1按降序排列,c2按递增顺序排序。

c1 <- c("a", "b", "c", "d", "d", "e", "f", "g", "h", "i")
c2 <- c("29-JAN-08", "29-JAN-08", "29-JAN-08", "29-JAN-08", "20-MAR-08", "28-MAR-08", "28-MAR-08", "28-MAR-08", "28-MAR-08", "28-MAR-08")
example <- data.frame(c1, c2)

我不能使用带有日期向量的符号:

> example <- example[order(example$c1, -example$c2),]
Error: unexpected input in "example <- example[order(example$c1, -1ex"

我无法弄清楚如何使用'减少'参数:

> example <- example[order(example$c1, example$c2, decreasing = c(F, T)),]
Error: unexpected input in "example <- example[order(example$c1, -1ex"

有没有办法可以通过这两列按顺序排序这个数据框,第一个按顺序排序,第二个按字母和日期类型分别按秒递减顺序?

2 个答案:

答案 0 :(得分:4)

以下是使用data.table软件包的答案,该软件包在清洁代码方面展示了它的优势:

example <- as.data.table(example)
# set the date variable as an actual date first
example$c2 <- as.Date(example$c2,format="%d-%b-%Y")

# then sort - notice no need to keep referencing example$...
example[order(c1,-as.numeric(c2))]

如何执行此操作的基本R版本将使用with

example[with(example,order(c1,-as.numeric(c2))),]

答案 1 :(得分:3)

这会做反向词法排序,但它可能不是你想要的,因为你还没有转换为Date值,因为反向排序将首先在角色日“字段”完成:

 example[ order(example$c1, rev(example$c2)) , ]
#-------
   c1        c2
1   a 29-JAN-08
2   b 29-JAN-08
3   c 29-JAN-08
4   d 29-JAN-08
5   d 20-MAR-08
6   e 28-MAR-08
7   f 28-MAR-08
8   g 28-MAR-08
9   h 28-MAR-08
10  i 28-MAR-08

如果您想以反向“真实”日期顺序进行排序:

example[ order(example$c1, -as.numeric(as.Date(example$c2, format="%d-%b-%Y"))) , ]
#-----
   c1        c2
1   a 29-JAN-08
2   b 29-JAN-08
3   c 29-JAN-08
5   d 20-MAR-08
4   d 29-JAN-08
6   e 28-MAR-08
7   f 28-MAR-08
8   g 28-MAR-08
9   h 28-MAR-08
10  i 28-MAR-08
9   h 28-MAR-08
10  i 28-MAR-08