在R中按降序排列日期/时间

时间:2013-05-05 21:25:10

标签: r date

我有一个数据框DF,其中一列是日期/时间,我想按此列的降序排序数据框。

DF <- data.frame(ID=c('ID3', 'ID2','ID1'), end=c('4/1/10 12:00', '6/1/11 14:20', '1/1/09 11:10'), age=c(40,30,20));

我首先使用endet列转换为et = as.POSIXct(DF$end,format='%m/%d/%Y %H:%M'),然后使用以下内容,但得到的错误是参数不接受一元运算符' - ':

out <- DF[order(-DF$et),];

我也尝试过使用降序标志,但是再次出现了关于参数长度不一致的错误。

out <- DF[order(DF$et, descending=TRUE),];

但是,升序似乎有效:out <- DF[order(DF$et),]

如何按降序排序(最近一次)?谢谢。

3 个答案:

答案 0 :(得分:10)

对于您的问题,只需很少的代码就可以轻松而通用地解决问题。

正如您所注意到的,减号不适用于日期,因为负面日期还不存在!

但是,通用功能可以产生相同的效果:rev()。因此,您可以将rev和order混合起来:

#init data
DF <- data.frame(ID=c('ID3', 'ID2','ID1'), end=c('4/1/10 12:00', '6/1/11 14:20', '1/1/09 11:10')
#change order
out <- DF[rev(order(as.Date(DF$end))),]

当您使用带数字的减号时,您将在一次通过中对负数进行分类。我认为当你使用rev()函数时,你正在进行两次传递,一次按升序排序,另一次用于反转顺序。但在3个观察结果中,很难看到。

希望它有所帮助。

答案 1 :(得分:8)

我认为这会奏效:

## Slightly bigger dataset with two times on same day:
DF <- data.frame(ID=c('ID3', 'ID2','ID1','ID4'), end=c('4/1/10 12:00', '6/1/11 14:20', '1/1/09 11:10' , '1/1/09 13:11'), age=c(40,30,20,20));

## Note to self - ALWAYS include a timezone.
DF$DTime <- as.POSIXct( DF$end , format = "%d/%m/%y %H:%M" , tz = "GMT")
DF[ order(DF$DTime , decreasing = TRUE ),]
#   ID          end age               DTime
#2 ID2 6/1/11 14:20  30 2011-01-06 14:20:00
#1 ID3 4/1/10 12:00  40 2010-01-04 12:00:00
#4 ID4 1/1/09 13:11  20 2009-01-01 13:11:00
#3 ID1 1/1/09 11:10  20 2009-01-01 11:10:00

答案 2 :(得分:0)

使用 dplyrlubridate -

library(dplyr)
library(lubridate)

DF %>% mutate(end = dmy_hm(end)) %>% arrange(desc(end))

#   ID                 end age
#1 ID2 2011-01-06 14:20:00  30
#2 ID3 2010-01-04 12:00:00  40
#3 ID1 2009-01-01 11:10:00  20

如果您不想更改 end 列的格式。

DF %>% arrange(desc(dmy_hm(end)))

#   ID          end age
#1 ID2 6/1/11 14:20  30
#2 ID3 4/1/10 12:00  40
#3 ID1 1/1/09 11:10  20