J'ai une colonne qui est la suivante;
datadate fiscal_year_end 1 2012-08-31 831 2 2017-01-31 201 3 1999-12-31 1231 4 2009-02-28 228 5 2010-12-31 1231 6 2005-12-31 1231 7 <NA> 630 8 2010-09-30 928 9 2009-09-30 930 10 2018-01-31 201 11 2017-12-31 1231 12 2004-12-31 1231
Ils correspondent aux mois, c'est-à-dire 12-31 , 9-27 et 20-2.
J'essaie de les mettre dans ce format mais je n'arrive pas à faire les choses correctement.
J'ai essayé str_replace_all (df $ fiscal_year_end, "(? en utilisant le package stringr mais c'est ne sort pas comme prévu.
Où est-ce que je me trompe ici?
Données:
structure(list(fiscal_year_end = c(1231L, 1231L, 1231L, 1231L, 202L, 1231L, 1231L, 202L, 1231L, 927L, 228L, 1231L, 1231L, 1231L, 1231L, 928L, 1231L, 1231L, 930L, 1231L, 1231L, 628L, 1231L, 1231L, 1228L, 930L, 1231L, 1231L, 1231L, 1231L, 927L, 630L, 1231L, 202L, 1231L, 1231L, 1231L, 1231L, 927L, 930L, 1231L, 1231L, 1231L, 1231L, 228L, 928L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1228L, 1231L, 1231L, 1231L, 1231L, 131L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 930L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 831L, 1231L, 102L, 1231L, 1231L, 1231L, 1130L, 1231L, 1228L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 930L, 1031L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 203L, 1231L, 1231L, 1231L, 1231L, 1231L, 1229L, 1231L, 1231L, 1231L, 426L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 202L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1229L, 1231L, 1231L, 630L, 1231L, 1231L, 1209L, 1231L, 1231L, 1231L, 728L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 630L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 727L, 1231L, 201L, 1231L, 1231L, 1231L, 1231L, 1231L, 630L, 1231L, 1231L, 1231L, 1130L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 930L, 930L, 1231L, 1231L, 331L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 1031L, 1229L, 1231L, 1231L, 1231L, 201L, 1231L, 1231L, 1231L, 1231L, 1231L, 1231L, 831L, 630L, 831L)), row.names = c(NA, -200L), .internal.selfref = <pointer: 0x0000000002511ef0>, class = "data.frame")
MODIFIER: p >
fiscal_year_end 1 1231 2 1231 3 1231 4 1231 5 202 6 1231 7 1231 8 202 9 1231 10 927
3 Réponses :
Nous pouvons séparer après le formatage à 4 chiffres
out <- read.csv(text = sub("(\\d{2})$", ",\\1", df1[[1]]), header = FALSE,
col.names = c("month", "day"), stringsAsFactors = FALSE)
head(out, 5)
# month day
#1 12 31
#2 12 31
#3 12 31
#4 12 31
#5 2 2
Ou utiliser un index négatif dans separate
df1 %>%
separate(fiscal_year_end, c("month", "day"), sep= -2)
Ou en utilisant uniquement base R , nous utilisons sub pour créer un délimiteur (en utilisant une seule capture group) et convertissez-le en un data.frame à deux colonnes avec read.csv
library(dplyr)
library(tidyr)
df1 %>%
mutate(fiscal_year_end = sprintf("%04d", fiscal_year_end)) %>%
separate(fiscal_year_end, c("month", "day"), sep= 2)
En utilisant la base R, nous pouvons utiliser sub avec deux groupes de capture, où la deuxième partie est un nombre à deux chiffres alors que la première partie est tout le reste.
sub("(.*)(\\d+{2}$)", "\\1-\\2", df$fiscal_year_end)
#[1] "12-31" "12-31" "12-31" "12-31" "2-02" "12-31" "12-31" "2-02" "12-31"
# "9-27" "2-28" "12-31" .....
Une autre méthode certes trop complexe:
[1] "12-31" "12-31" "12-31" "12-31" "2-02" "12-31" "12-31" "2-02" "12-31" "9-27"
Résultat:
res1<-ifelse(nchar(my_df$fiscal_year_end)%%2==0,substring(my_df$fiscal_year_end,1,2),
substring(my_df$fiscal_year_end,1,1))
res2<-ifelse(nchar(my_df$fiscal_year_end)%%2==0,substring(my_df$fiscal_year_end,3,4),
substring(my_df$fiscal_year_end,2,3))
paste0(res1,"-",res2)
202doit-il être2-02plutôt que20-2?Je pense que vous avez peut-être raison, j'ai ajouté une petite modification qui pourrait le prouver.
laquelle sont vos données d'entrée? Est-ce le
dputou les nouvelles données