我正在试图弄清楚如何按顺序对数据框进行排序,如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"
有没有办法可以通过这两列按顺序排序这个数据框,第一个按顺序排序,第二个按字母和日期类型分别按秒递减顺序?
答案 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