我有一个数据框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));
我首先使用end
将et
列转换为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),]
。
如何按降序排序(最近一次)?谢谢。
答案 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)
使用 dplyr
和 lubridate
-
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