3

我试图弄清楚如何按 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"

有没有办法可以按这两列对这个数据框进行排序,当列分别是字符和日期类型时,按第一列升序,第二列降序?

4

2 回答 2

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))),]
于 2013-04-25T03:36:35.940 回答
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
于 2013-04-25T02:26:18.983 回答