Regexp从年份开始分割月份mmyyyy

时间:2015-12-30 11:14:39

标签: regex r date

我有一个变量,它是月份和年份的串联,以数字格式表示。月份的格式为1-12,而不是01-12。

我的变量如下:

mmyyyy
12014
22014
102014
52015
112015

我正在寻找匹配月份或年份的正则表达式:

一年,我做了类似的事情:

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

但是这个月,我正在挣扎。我的第一个想法是用空白替换2014,2015等,然后将结果转换为数字。

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

但是在这里,我无法找到合适的正则表达式。

最后,我想要一个带有数字年(yyyy)的变量/向量和一个带有数字月份的变量/向量。

7 个答案:

答案 0 :(得分:6)

一个选项是

# 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

这适用于任何4位数年份。

答案 1 :(得分:6)

使用axis.ticks.margin的可能解决方案在一次通话中同时创建tidyrmonth列。

year

数据

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

答案 2 :(得分:3)

mmyyyy <- c(12014,22014,102014, 52015, 112015)

使用sprintf

制作一个6位数的向量
dates <- sprintf("%06d", mmyyyy)

您可以使用yearmon

中的zoo功能
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"

编辑:根据@ David的评论更新

答案 3 :(得分:1)

您可以使用软件包 unglue

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

答案 4 :(得分:0)

如下所示(假设您只处理年份> 2000)

month <- as.numeric(gsub("20[0-9]+", "", mmyy))

答案 5 :(得分:0)

我真的不知道如何做REGEX - 但这是一个简单的代码。此代码将适用于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"

答案 6 :(得分:-1)

Extracting the last n characters from a string in R

为什么不将最后一个字符拆分为年份? 请参阅stringr包中的str_sub。