我有一个变量,它是月份和年份的串联,以数字格式表示。月份的格式为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)的变量/向量和一个带有数字月份的变量/向量。
答案 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
的可能解决方案在一次通话中同时创建tidyr
和month
列。
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
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。