Ich habe eine Variable, die die Verkettung von Monat und Jahr in einem numerischen Format ist. Der Monat hat das Format 1-12, nicht 01-12.

Meine Variable sieht aus wie:

mmyyyy
12014
22014
102014
52015
112015

Ich suche einen regulären Ausdruck, der nur dem Monat oder dem Jahr entspricht:

Für ein Jahr habe ich so etwas gemacht wie:

year <- ifelse(grepl("2014", mmyyyy), 2014, ifelse(grepl("2015", mmyyyy), 2015, 2016))

Aber für den Monat kämpfe ich. Mein erster Gedanke ist, 2014, 2015 usw. durch Leerzeichen zu ersetzen und dann das Ergebnis in numerische Werte umzuwandeln.

month <- as.numeric(gsub("[[^2014]]", "", mmyyyy))

Aber hier kann ich keinen passenden regulären Ausdruck finden.

Am Ende möchte ich eine Variable / einen Vektor mit dem numerischen Jahr (JJJJ) und eine Variable / einen Vektor mit dem numerischen Monat.

1
YCR 30 Dez. 2015 im 14:14

6 Antworten

Beste Antwort

Eine Option ist

# for the months:
> as.numeric(gsub("(.*)[0-9]{4}$", "\\1", x))
#[1]  1  2 10  5 11
# for the years:
> as.numeric(gsub(".*([0-9]{4})$", "\\1", x))
#[1] 2014 2014 2014 2015 2015

Dies funktioniert für alle 4-stelligen Jahre.

6
talat 30 Dez. 2015 im 11:25

Eine mögliche Lösung mit tidyr, mit der in einem Aufruf gleichzeitig month und year Spalten erstellt werden.

library(tidyr)
extract(df, mmyyyy, c("month", "year"), "(\\d+)(\\d{4})", convert = TRUE)
#   month year
# 1     1 2014
# 2     2 2014
# 3    10 2014
# 4     5 2015
# 5    11 2015

Daten

df <- data.frame(mmyyyy = c(12014,
                            22014,
                            102014,
                            52015,
                            112015))
7
David Arenburg 12 März 2016 im 17:58
mmyyyy <- c(12014,22014,102014, 52015, 112015)

Erstellen eines 6-stelligen Vektors mit sprintf

dates <- sprintf("%06d", mmyyyy)

Sie können die Funktion yearmon aus dem Paket zoo verwenden

library(zoo)
dates1 <- as.yearmon(dates, format = "%m%Y")
format(dates1, "%m")
# [1] "01" "02" "10" "05" "11"
format(dates1, "%Y")
# [1] "2014" "2014" "2014" "2015" "2015"

BEARBEITEN: Aktualisiert gemäß den Kommentaren von @ David

4
Ronak Shah 30 Dez. 2015 im 12:00

Sie können das Paket unglue verwenden:

df <- data.frame(mmyyyy = c(12014, 22014, 102014, 52015, 112015))
library(unglue)
unglue_unnest(df, mmyyyy, "{month}{year=\\d{4}}", convert = TRUE)
#>   month year
#> 1     1 2014
#> 2     2 2014
#> 3    10 2014
#> 4     5 2015
#> 5    11 2015
1
Moody_Mudskipper 8 Okt. 2019 im 15:26

Wie wäre es mit so etwas wie unten (vorausgesetzt, Sie haben es nur mit Jahren> 2000 zu tun)

month <- as.numeric(gsub("20[0-9]+", "", mmyy))
0
Sam Gilbert 30 Dez. 2015 im 11:27

Ich weiß nicht wirklich, wie man REGEX macht - aber hier ist ein einfacher Code. Dieser Code funktioniert für alle Jahre bis 9999 :)

dmmyyyy<-c("12014","22014","102014","52015","112015")
dmmyyyy<-as.character(dmmyyyy)
month <- substr(dmmyyyy, nchar(dmmyyyy)-4+1, nchar(dmmyyyy))
month
[1] "2014" "2014" "2014" "2015" "2015"
0
CuriousBeing 30 Dez. 2015 im 12:27