解析字符串,提取两位数年份并补全成四位数字格式
Parse string, extract two-digit year and complete into four digit format
我有这样的字符串
y1 <- "AB99"
y2 <- "04CD"
y3 <- "X90Z"
y4 <- "EF09"
y5 <- "12GH"
我需要提取两位数年份并将其完成为四位数格式。
输入范围为 1990 - 2020.
输出应该是:
"1999"
"2004"
"1990"
"2009"
"2012"
我试过了:
fun <- function(x) {
year <- readr::parse_number(x)
if(year < 50) year <- paste0("20", year) else year <- paste0("19", year)
return(year)
}
除 2000 - 2009 年(测试用例 y2
和 y4
)外,一切正常。
哪些功能可以帮助我在那些年也能正常工作?
数字没有前导 0
,因此您得不到想要的输出。使用 stringr 和 str_pad
函数应该可以解决您的问题。
fun <- function(x) {
year <- readr::parse_number(x)
if (year < 50) {
year <- paste0("20", stringr::str_pad(year, 2, side="left", "0"))
} else {
year <- paste0("19", year)
}
return(year)
}
另一个提示:使用 return
而不是 print
。
parse_number 将 return 4、y2情况下的个位数。要获得所需的输出,您可以在字符数上再添加一个条件,如下所示:
fun_1 <- function(x) {
year <- readr::parse_number(x)
#cat("year is ",year,"\n") #added for check
if(year < 50 & nchar(year)<2){
year <- paste0("20","0", year)
} else {
year <- paste0("19", year)
}
# cat("Year post changes",year,"\n") # added for check,
print(year)
}
输出:
fun_1(y2)
year is 4
Year post changes 2004
我添加了 cat 步骤只是为了检查。
使用一些基本的正则表达式,您可以删除所有不是数字的内容,并根据需要将 ifelse()
应用于前缀 19 或 20:
# Example data
y <- c(
y1 = "AB99",
y2 = "04CD",
y3 = "X90Z",
y4 = "EF09",
y5 = "12GH"
)
# Extract only the number
num <- gsub("\D", "", y)
paste0(ifelse(num >= "90", "19", "20"), num)
# [1] "1999" "2004" "1990" "2009" "2012"
或者,使用整数:
num <- as.integer(gsub("\D", "", y)) # or as.integer(readr::parse_number(y))
num + ifelse(num >= 90L, 1900L, 2000L)
# [1] 1999 2004 1990 2009 2012
我有这样的字符串
y1 <- "AB99"
y2 <- "04CD"
y3 <- "X90Z"
y4 <- "EF09"
y5 <- "12GH"
我需要提取两位数年份并将其完成为四位数格式。 输入范围为 1990 - 2020.
输出应该是:
"1999"
"2004"
"1990"
"2009"
"2012"
我试过了:
fun <- function(x) {
year <- readr::parse_number(x)
if(year < 50) year <- paste0("20", year) else year <- paste0("19", year)
return(year)
}
除 2000 - 2009 年(测试用例 y2
和 y4
)外,一切正常。
哪些功能可以帮助我在那些年也能正常工作?
数字没有前导 0
,因此您得不到想要的输出。使用 stringr 和 str_pad
函数应该可以解决您的问题。
fun <- function(x) {
year <- readr::parse_number(x)
if (year < 50) {
year <- paste0("20", stringr::str_pad(year, 2, side="left", "0"))
} else {
year <- paste0("19", year)
}
return(year)
}
另一个提示:使用 return
而不是 print
。
parse_number 将 return 4、y2情况下的个位数。要获得所需的输出,您可以在字符数上再添加一个条件,如下所示:
fun_1 <- function(x) {
year <- readr::parse_number(x)
#cat("year is ",year,"\n") #added for check
if(year < 50 & nchar(year)<2){
year <- paste0("20","0", year)
} else {
year <- paste0("19", year)
}
# cat("Year post changes",year,"\n") # added for check,
print(year)
}
输出:
fun_1(y2)
year is 4
Year post changes 2004
我添加了 cat 步骤只是为了检查。
使用一些基本的正则表达式,您可以删除所有不是数字的内容,并根据需要将 ifelse()
应用于前缀 19 或 20:
# Example data
y <- c(
y1 = "AB99",
y2 = "04CD",
y3 = "X90Z",
y4 = "EF09",
y5 = "12GH"
)
# Extract only the number
num <- gsub("\D", "", y)
paste0(ifelse(num >= "90", "19", "20"), num)
# [1] "1999" "2004" "1990" "2009" "2012"
或者,使用整数:
num <- as.integer(gsub("\D", "", y)) # or as.integer(readr::parse_number(y))
num + ifelse(num >= 90L, 1900L, 2000L)
# [1] 1999 2004 1990 2009 2012