2
votes

fractionnement des chaînes mois / année en r par `-`

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

r

3 commentaires

202 doit-il être 2-02 plutôt que 20-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 dput ou les nouvelles données


3 Réponses :


2
votes

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)


0 commentaires

2
votes

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" ..... 


0 commentaires

2
votes

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)


0 commentaires