2017-10-06 7 views
0

Je souhaite trier mes données dans la colonne des dates. Mon exemple dataframe:Comment organiser ou trier des dates avec R et dplyr

library(tidyverse)  

dates <- tibble(date = c("01-01-2017", "02-03-2017", "01-02-2017", "02-01-2017", "01-03-2017"), 
        value = c(8, 12, 4, 14, 11)) 

donc ce qui suit ne fonctionne pas car il ne sortes les jours.

arrange(dates, date) 
+0

Utilisez 'as.Date()' ou 'dmy()' dans le package 'lubridate' pour les convertir en formats de date réels. Si vous stockez des dates sous forme de chaînes, elles sont triées en tant que telles, c'est-à-dire par ordre alphabétique. –

+0

Vous devez convertir votre vecteur de date en une classe Date quelque chose comme 'dat <- as.Date (date $ date,"% m-% d-% Y ")'. où dat est le nom de votre tibbly. – lmo

Répondre

1

Il y a un problème ici en fonction de vos commentaires, types de données date Vous devez les stocker comme une date, pas une chaîne de caractères, de sorte que vous puissiez les trier et les filtrer, etc.

Lorsque vous choisissez de générer les informations, vous pouvez les formater et les rendre jolies . Le premier exemple rendra les dates dans des dates réelles, alors vous pouvez filtrer/trier par cette colonne, la seconde ne fera que trier, et si vous souhaitez effectuer une autre opération, vous aurez besoin de convertir à nouveau.

Option 1 (Bon):

dates_mos <- dates %>% 
    mutate(date = as.Date(date, "%d-%m-%Y")) %>% 
    arrange(date) 

Sortie 1:

 date value 
     <date> <dbl> 
1 2017-01-01  8 
2 2017-01-02 14 
3 2017-02-01  4 
4 2017-03-01 11 
5 2017-03-02 12 

Option 2 (pas si bon):

dates_mos <- dates %>% 
    arrange(date = as.Date(date, "%d-%m-%Y")) 

Sortie 2:

 date value 
     <chr> <dbl> 
1 01-01-2017  8 
2 02-01-2017 14 
3 01-02-2017  4 
4 01-03-2017 11 
5 02-03-2017 12 
+0

Le format doit être% d-% m-% Y mais les données donnent ce% Y -% m-% d en conséquence. Quand je le formate comme ceci date $ date <- format (as.Date (dates $ date, format = "% Y-% m-% d"), "% d-% m-% Y") il ne le fait pas travailler soit et la classe est de nouveau changée en caractère ... – Tdebeus

+0

@Tdebeus vous confondez la représentation textuelle d'une date avec un type de données de date. Le premier est une chaîne de caractères qui ressemble à un humain comme une date, le second est une date lisible par une machine, vous pouvez seulement filtrer/trier sur ce dernier – User632716

+1

Très gentil modifier merci! – Tdebeus

2

La façon dont vous avez enregistré les données dans votre question n'est pas appropriée pour le tri en fonction des dates. Il est enregistré en tant que chaînes normales, alors que vous souhaitez que R le reconnaisse comme des dates.

Pour ce faire, entrez as.Date() en incluant un certain format pour la chaîne de date. A partir de votre question, il ne sait pas si vos chaînes de date sont jour-mois-année (format = "%d-%m-%Y") ou mois-jour-année (format = "%m-%d-%Y"):

dates$date <- as.Date(dates$date, format="%d-%m-%Y") 
arrange(dates, date) 
# 1 2017-01-01  8 
# 2 2017-01-02 14 
# 3 2017-02-01  4 
# 4 2017-03-01 11 
# 5 2017-03-02 12 
+0

Le format doit être '% d-% m-% Y' mais les données donnent comme résultat'% Y-% m-% d'. Quand je le formate comme ceci 'dates $ date <- format (as.Date (dates $ date, format ="% Y-% m-% d "),"% d-% m-% Y ")' il doesn ne fonctionne pas non plus et la classe est de nouveau changée en caractère ... – Tdebeus

+0

Le format que la machine interprète après 'as.Date()' est le format que vous voulez avoir. Ce que vous voulez * voir * n'est toutefois pas pertinent, sauf si vous devez préparer un type de rapport où ils ont des formats de date standard. Dans le cas d'un rapport, vous pouvez simplement transformer vos données formatées en guillemets avec le 'format()' auquel vous faites référence dans votre commentaire –