0
votes

Changement de date.format dans R

Alors imaginons que j'ai un vecteur contenant des dates:

vec <- c(T1 1993, T2 1993, T3 1993, T4 1993)

Comment puis-je le transformer efficacement en un vecteur contenant des dates trimestrielles:

vec <- c(11993, 21993, 31993, 41993) 

Merci


4 commentaires

Quelle est l'attente de production? vec doit-il contenir des chaînes ou un objet datetime? Le résultat que vous fournissez n'est pas une syntaxe R correcte.


bien n'importe quel format de données me conviendrait, je suis nouveau sur R malheureusement


Si vous voulez un vecteur de caractères (chaînes), cela fait ce que vous voulez: sub ("(\\ d)", "T \\ 1", vec) . Il recherche le premier chiffre et le remplace par lui-même, avec un T en préfixe et un espace ajouté. Il utilise ce qu'on appelle une «expression régulière», qui est un langage entier à lui seul.


Votre vecteur est-il vraiment numérique? Votre deuxième vecteur ( c (T1 1993, T2 1993) ) suggère qu'il pourrait s'agir de chaînes à la place (puisque ce n'est évidemment pas du code légal).


3 Réponses :


1
votes

Vous pouvez utiliser stringr:

library(zoo)
library(tidyverse)

# Your vector
vec <- c(11993, 21993, 31993, 41993)

# Substring to create "T" values
quarter <- paste0("T",str_sub(vec, start = 1L, end = 1L))

# Paste back together
vec <- paste0(quarter, " ",str_sub(vec, start = 2L))

# Keep as yearqtr 
vec_date <- as.yearqtr(vec, format = "T%q %Y")

# Keep as.Date
vec_date <- as.Date(as.yearqtr(vec, format = "T%q %Y"))

Ce qui vous donne:

"1993-01-01" "1993-04-01" "1993-07-01" "1993-10-01"

Mise à jour: p >

Vous pouvez utiliser le package zoo pour convertir en type yearqtr:

vec_date <- as.Date(as.yearqtr(vec, format = "T%q %Y"))

Ce qui nous donne:

"1993 Q1" "1993 Q2" "1993 Q3" "1993 Q4"

Vous pouvez également inclure as.Date:

vec_date <- as.yearqtr(vec, format = "T%q %Y")

Ce qui nous donne: p>

"T1 1993" "T2 1993" "T3 1993" "T4 1993"

Tout ensemble:

library(stringr)

quarter <- paste0("T",str_sub(vec, start = 1L, end = 1L))
vec <- paste0(quarter, " ",str_sub(vec, start = 2L))


8 commentaires

Merci pour votre réponse, désolé si je n'étais pas clair, mais je voudrais en fait transformer "11993" dans un format de date valide afin que je puisse le tracer comme un axe x. Le "T1 1993" était juste pour illustrer ce qui me semblait être un format valide mais apparemment ce n'est pas parce que R dit qu'il n'est pas standard.


Qu'est-ce qui est valable pour 11993 en tant que classe Date ? Peut-être mieux demandé ... ce n'est pas la Date , est-ce donc toujours le trimestre ou le mois-année?


C'est toujours un trimestre d'année dans mon ensemble de données


Bizarre, votre as.yearqtr (vec, format = "T% q% y") ne semble pas respecter le format (sur ma console). Je suis sur zoo-1.8.7, et bien que la version 1.8.8 soit disponible, elle ne répertorie aucun changement. Les pensées?


J'utilise aussi zoo-1.8.7. Que voulez-vous dire par le fait de ne pas respecter le format? J'aurais dû noter que l'utilisation de as.Date convertit les trimestres en mois / année au plus tôt pour le trimestre, nous obtenons donc: "2019-01-01" "2019-04-01" "01/07/2019" "01/10/2019"


Oh, désolé, j'utilisais le vec brut, pas le quart -ized vec modifié. Sur la version numérique, as.yearqtr (vec, format = "...") n'a pas utilisé format = , il a renvoyé "11993 Q1" , indiquant mon erreur.


Merci pour votre longue réponse. Je suis désolé mais je manque encore quelque chose ici. Lorsque j'exécute dans la console le code suivant pastebin.com/20K0xFJY (avec mon vecteur initial plus long), j'obtiens un vecteur avec uniquement des dates de 2019 à 2020, ce qui n'est pas cohérent avec mon ensemble de données initial.


Je viens de modifier la réponse - j'ai fait une erreur et utilisé un y minuscule. Vous devez avoir format = "T% q% Y avec un Y majuscule.



2
votes

Base R:

sub("^(.*)(.{4})$", "T\\1 \\2", vec)
# [1] "T1 1993" "T2 1993" "T3 1993" "T4 1993"


0 commentaires

1
votes

Une autre solution de base R sans regex

paste0("T", substr(vec, 1, 1), " ", substr(vec, 2, 5))
# [1] "T1 1993" "T2 1993" "T3 1993" "T4 1993"


0 commentaires