J'ai une colonne entière dans mon jeu de données qui a des valeurs d'année à quatre chiffres, comme:
2001 2002 2002 2002 2003 2005
J'essaie de convertir la valeur de l'année à quatre chiffres en type Date.
Le code que j'utilise est:
year <- as.Date(as.character(data_file$evtYear), format = "%Y")
Mais le résultat est:
"2001-05-15" "2002-05-15" "2002-05-15" "2002-05-15" "2003-05-15" "2005-05-15"
Cela donne la mauvaise sortie. Cela donne des valeurs sur deux ans dans une date (2001 et 15 également).
Je veux juste convertir ma partie d'année à quatre chiffres des données d'origine en "Année" dans le type Date. Ce qui est attendu est tout simplement:
2001 2002 2002 2002 2003 2005
Mais leur classe devrait être de type Date.
Comment y parvenir en R?
D'après les commentaires, il est apparu que la personne qui posait la question n'avait pas besoin de changer l'année numérique en classe "Date"
; néanmoins, la question posée est de savoir comment le faire, voici donc une réponse.
Voici quelques manières de créer un objet de classe "Date"
à partir d'une année numérique à 4 chiffres. Tous utilisent as.Date
:
yrs <- c(2001, 2002, 2002, 2002, 2003, 2005)
1) ISOdate
as.Date(ISOdate(yrs, 1, 1)) # beginning of year
as.Date(ISOdate(yrs, 12, 31)) # end of year
Cette solution ISOdate est un peu délicate car elle crée un objet POSIXct intermédiaire pour éviter les problèmes de fuseau horaire. Vous pourriez préférer l'une des options suivantes.
2) coller
as.Date(paste(yrs, 1, 1, sep = "-")) # beginning of year
as.Date(paste(yrs, 12, 31, sep = "-")) # end of year
3) Zoo :: as.yearmon
library(Zoo)
as.Date(as.yearmon(yrs)) # beginning of year
as.Date(as.yearmon(yrs) + 11/12, frac = 1) # end of year
Remarque: Si y
est le résultat de l'une des opérations ci-dessus, format(y, "%Y")
donne l'année du caractère et as.numeric(format(y, "%Y"))
indique l'année numérique.
Comme déjà reconnu par le PO, une année seule ne constitue pas une date valide car le mois et le jour ne sont pas spécifiés.
Toutefois, certaines fonctions de conversion de date et d'heure, telles que ymd()
, parse_date_time()
, dans le package lubridate
reconnaissent un paramètre truncated
afin de permettre l'analyse de dates incomplètes:
yrs <- c(2001, 2002, 2002, 2002, 2003, 2005)
lubridate::ymd(yrs, truncated = 2L)
[1] "2001-01-01" "2002-01-01" "2002-01-01" "2002-01-01" "2003-01-01" "2005-01-01"
Les années ont été complétées au 1er janvier pour donner une date valide. Le résultat est de classe Date
.
Tu peux faire:
library(lubridate)
yrs <- c(2001, 2002, 2002, 2002, 2003, 2005)
yr <- as.Date(as.character(yrs), format = "%Y")
y <- year(yr)
Sortie:
2001 2002 2002 2002 2003 2005
Une réponse lubrifiante:
library(lubridate)
year <- ymd(sprintf("%d-01-01",data_file$evtYear))