我有一个数据框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));
Run Code Online (Sandbox Code Playgroud)
我首先将end列转换为et使用et = as.POSIXct(DF$end,format='%m/%d/%Y %H:%M'),并使用以下内容,但得到的错误是参数不接受一元运算符' - ':
out <- DF[order(-DF$et),];
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用降序标志,但是再次出现了关于参数长度不一致的错误.
out <- DF[order(DF$et, descending=TRUE),];
Run Code Online (Sandbox Code Playgroud)
但是,升序似乎有效:out <- DF[order(DF$et),].
如何按降序排序(最近一次)?谢谢.
pom*_*tee 13
只需很少代码就可以轻松,通用地解决您的问题.
正如您所注意到的,减号不适用于日期,因为负日期尚不存在!
但是,通用功能可以产生相同的效果: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))),]
Run Code Online (Sandbox Code Playgroud)
当您使用带数字的减号时,您将在一次通过中对负数进行分类.我认为当你使用rev()函数时,你正在进行两次传递,一次按升序排序,另一次用于反转顺序.但在3个观察结果中,很难看到.
希望它有所帮助.
我认为这会奏效:
## 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
Run Code Online (Sandbox Code Playgroud)