web-dev-qa-db-fra.com

Date / heure de commande en ordre décroissant en R

J'ai un bloc de données DF avec l'une des colonnes étant date/heure et je voudrais commander le bloc de données dans l'ordre décroissant de cette colonne.

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));

J'ai d'abord converti la colonne end en et en utilisant et = as.POSIXct(DF$end,format='%m/%d/%Y %H:%M'), et j'ai utilisé ce qui suit, mais j'ai eu l'erreur que l'opérateur unaire '-' n'est pas accepté pour l'argument:

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

J'ai également essayé d'utiliser le drapeau descendant, mais j'ai de nouveau obtenu une erreur indiquant que les arguments n'étaient pas de la même longueur.

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

Cependant, l'ordre croissant semble fonctionner: out <- DF[order(DF$et),].

Comment puis-je commander par ordre décroissant (date la plus récente en premier)? Je vous remercie.

15
user2327621

Il existe une solution simple et générale à votre problème avec peu de code.

Comme vous l'avez remarqué, le signe moins ne fonctionne pas avec les dates car les dates négatives n'existent pas encore!

Cependant, vous pouvez avoir le même effet avec une fonction à usage général: rev (). Par conséquent, vous mélangez rev et order comme:

#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))),]

Lorsque vous utilisez le signe moins avec des nombres, vous classez les nombres négatifs en un seul passage. Je pense que lorsque vous utilisez la fonction rev (), vous effectuez deux passes, une pour trier par ordre croissant et une pour inverser l'ordre. Mais sur 3 observations, c'est difficile à voir.

J'espère que cela a aidé.

13
pommedeterresautee

Je pense que cela fonctionnera:

## 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
9
Simon O'Hanlon