• Aucun résultat trouvé

La fonction str_pad() Certains fichiers de données ont des largeurs fixes pour chaque colonne. Si on désire créer facilement ce genre de fichiers, la fonction str_pad()

Dans le document Notes de cours de R - Version 2 (Page 94-101)

2.4 Manipulation des données

2.4.3 Chaînes de caractères

2.4.3.6 Nettoyage, complétion

2.4.3.6.2 La fonction str_pad() Certains fichiers de données ont des largeurs fixes pour chaque colonne. Si on désire créer facilement ce genre de fichiers, la fonction str_pad()

dupackage stringrpeut se révéler très pratique. En effet, elle permet de définir un carac-tère à insérer avant ou après une chaîne, ou bien avant et après, et de le répéter un nombre donné de fois. On précise la longueur des chaînes retournées avec l’argument width, le caractère à insérer pour éventuellement compléter la chaîne avec l’argumentpadet le côté sur lequel insérer ce caractère avec l’argument side pouvant prendre les valeurs "left",

"right" ou "both".

coords <- c(lat = "48.11", long = "-1.6794")

str_pad(string = coords, width = 7, side = "left", pad = " ")

## [1] " 48.11" " -1.6794"

# Les chaînes plus longues que la valeur fournie à width sont inchangées str_pad(c("Gauthier", "Pascaline"), 3)

## [1] " Gauthier " " Pascaline "

Cette fonction est également utile lorsque l’on veut créer des noms de fichiers préfixés par un nombre, de manière à permettre leur rangement par ordre croissant dans l’explorateur de fichier (10.txtviendra avant 9.txttandis que 09.txtviendra avant 10.txt).

2.4.3.6.3 La fonction str_trim() Pour retirer des caractères blancs (e.g., espaces, sauts de ligne, retours à la ligne, quadratins, etc.), on peut utiliser des méthodes abordées dans la Section @ref(manip_strings_regex), ou bien la fonction str_trim() du package {stringr}. Elle retire tous les caractères blancs à gauche et à droite d’une chaîne de caractères. L’argument side permet de choisir le côté pour lequel on désire retirer les caractères blancs. Il peut prendre les valeurs both (par défaut), leftou right.

texte <- c("\n\nPardon, du sucre ?", "Oui, seize \n ", "...\t\t...\t") str_trim(texte, side = "both")

## [1] " Pardon , du sucre ?" "Oui , seize " "...\ t\t ..."

2.4.4 Dates

Comme indiqué dans la Section 2.2.1.3, les dates en R peuvent être de trois classes diffé-rentes,Date,POSIXctetPOSIXlt. Dans cette Section, nous allons voir comment manipuler ces dates, à l’aide des fonctions du package {lubridate}.

2.4.4.1 Extraction

Lepackage{lubridate} propose quelques fonctions pour accéder aux éléments d’une date.

Fonction Extraction

second() secondes (0–59)

minute() minutes (0–59)

hour() heures (0–23)

day(),mday() jour du mois (1–31)

wday() jour de la semaine (1–7), le dimanche étant le 1

yday() jour de l’année (1–366)

week() numéro de la semaine dans l’année. Les

semaines sont définies comme les pé- riodes complètes de 7 jours s’étant déroulées depuis le premier janvier, plus 1

isoweek() Semaine de l’année (00-53). Si la semaine (qui commence un lundi) qui contient le 1er janvier a 4 jours ou plus dans la nouvelle année, alors elle est considérée comme la semaine 1. Sinon, elle est considérée comme la dernière de l’année précédente, et la suivante est considérée comme semaine 1

month() mois (1–12)

year() année, uniquement celles après l’an 1

tz() fuseau horraire

Les fonctions wday() et month() permettent aussi d’afficher le jour de la semaine et le mois, respectivement, en chaîne de caractères, en donnant leur nom dans le langage par défaut de votre session R. Pour cela, il faut attribuer la valeur TRUE a l’argument label. Si on souhaite les abréviations, il faut donner la valeurTRUE à l’argument abbr en sus.

library(lubridate)

(d <- ymd_hms("2020-03-17 23:59:59"))

## [1] "2020 -03 -17 23:59:59 UTC "

lubridate::wday(d, label = TRUE)

## [1] Mar

## Levels : Dim < Lun < Mar < Mer < Jeu < Ven < Sam

lubridate::wday(d, label = TRUE, abbr = TRUE)

## [1] Mar

## Levels : Dim < Lun < Mar < Mer < Jeu < Ven < Sam

Il arrive que l’on préfère obtenir ces noms dans une autre langue (lorsque l’on doit réaliser des graphiques en anglais, par exemple). Deux options simples peuvent être mises en place : la traduction “à la main”, en créant un tableau de correspondande entre la langue par défaut de la session R et celle désirée. La seconde solution est plus pratique. Elle consiste à faire appel à l’argumentlocaledes fonctions de {lubridate}. Il suffit de fournir à cet argument le nom du local à utiliser. Le seul hic, est que ce nom est dépendant du système. . . Il faut donc le prendre en compte lors de la rédaction de codes, pour que le script puisse être lancé sur un système Unix ou Windows.

Sous Unix, on peut afficher l’ensemble des noms disponibles avec la commande système suivante (évaluée directement depuis la console R) :

system("locale -a", intern = TRUE)

Pour Windows, il faut consulter la liste des noms est disponible sur la documentation en ligne de Microsoft : il faut chercher dans un moteur de recherche l’expression : "MSDN Language Strings"[ˆcomme indiqué sur cette réponsesur StakOverflow.].

Ainsi, pour obtenir l’affichage du nom du jour de la semaine en anglais, on écrira :

— Sous Unix :

wday(ymd("2020-03-17"), label = TRUE, abbr = FALSE, locale = "en_US")

— Sous Windows :

wday(ymd("2020-03-17"), label = TRUE, abbr = FALSE, locale = "english_us")

Si on désire que le script soit exportable sur différents systèmes d’exploitation, on peut pré-voir, à l’aide d’une instruction conditionnelle (ces aspects seront abordés dans un autre cha-pitre), les deux cas de figure : Unix ou Windows. En effet, l’expression.Platform$OS.type permet d’afficher le type de système d’exploitation :

.Platform$OS.type

## [1] " unix "

Aussi, pour que le code soit exportable, on peut écrire : if(.Platform$OS.type == "unix"){

wday(ymd("2020-03-17"), label = TRUE, abbr = FALSE, locale = "en_US")

}else{

wday(ymd("2020-03-17"), label = TRUE, abbr = FALSE, locale = "english_us")

}

Lorsque les formats de dates ne respectent pas les standards habituels (c’est le cas par exemple avec des dates que l’on peut obtenir via l’API de Twitter), les fonctions du type ymd_hms() ne parviendront pas à reconnaître le format. Le package {lubridate} dispose d’une fonction qui permettra de définir soi-même le format de la date :parse_date_time() Admettons que nous ayons une date sous forme de chaîne de caractères écrite de la sorte : x <- "Fri Dec 25 20:12:00 +0001 2020"

Il faut indiquer à l’argumentorders l’ordre dans lequel les différents éléments composant la date apparaissent. La Section??dates-POSIXct) recense tous les éléments de dates dans un tableau. Ces éléments sont utiles ici. On comprend que la date contient le jour de la semaine abrégé (%a), le mois abrégé (%b), puis le numéro du jour dans le mois (%d) etc.

De plus, les abréviations correspondent au local anglais, il faut dont indquer à l’argument localeque la date est rédigée en anglais.

parse_date_time(x, orders = "%a %b %d %H:%M:%S %z %Y", locale = "en_US")

## [1] "2020 -12 -25 20:11:24 UTC "

2.4.4.2 Opérations

Avant de présenter quelques exemples, créons quelques variables de dates. Rappelons-nous qu’avec les fonctions ne prenant pas en compte l’heure, la minute et la seconde, les objets créés avec les fonctions du package {lubridate} sont de classeDate. Si ces éléments sont pris en compte, les objets sont de typePOSIXct.

# Quelques dates

d_date_1 <- ymd("2019-09-01") d_date_2 <- ymd("2020-10-21") class(d_date_1)

## [1] " Date "

d_posix_ct_1 <- ymd_hms("2020-03-17 12:32:28") d_posix_ct_2 <- ymd_hms("2020-05-11 13:55:44") class(d_posix_ct_1)

## [1] " POSIXct " " POSIXt "

Pour ajouter ou retirer des durées de temps, il faut se rappeler comment sont stockées les dates. Avec les objets de mode Date, il s’agit d’un nombre de jours. Aussi, additioner un nombre nà un objet de type date retourne la date n jours plus tard. Pour les objets de classe POSIXct ou POSIXlt, comme R stock la date en secondes, l’ajout d’un nombre n retourne la date augmentée den secondes.

d_date_2

## [1] "2020 -10 -21"

d_date_2 + 10

## [1] "2020 -10 -31"

d_date_2 - 10

## [1] "2020 -10 -11"

d_posix_ct_2

## [1] "2020 -05 -11 13:55:44 UTC "

d_posix_ct_2 + 10

## [1] "2020 -05 -11 13:55:54 UTC "

d_posix_ct_2 - 10

## [1] "2020 -05 -11 13:55:34 UTC "

Toujours dû à ce stockage interne en jours ou secondes, il est possible de comparer facile-ment deux dates entre-elles, avec les opérateurs classiques.

d_date_1 > d_date_2

## [1] FALSE

d_posix_ct_2 > d_posix_ct_1

## [1] TRUE

d_posix_ct_2 == d_posix_ct_1

## [1] FALSE

Dans le document Notes de cours de R - Version 2 (Page 94-101)