簡體   English   中英

解析字符串,提取兩位數年份並完成成四位數格式

[英]Parse string, extract two-digit year and complete into four digit format

我有像這樣的字符串

y1 <- "AB99"
y2 <- "04CD"
y3 <- "X90Z"
y4 <- "EF09"
y5 <- "12GH"

我需要提取兩位數年份並將其完成為四位數格式。 輸入范圍為 1990 - 2020 年。

output 應該是:

"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 年(測試用例y2y4 )。

哪些功能可以幫助我在那些年也能正常工作?

使用一些基本的正則表達式,您可以刪除不是數字的所有內容,並根據需要將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

數字沒有前導0 ,因此您無法獲得所需的 output。 使用 stringr 和str_pad function 應該可以解決您的問題。

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 將返回 4,y2 案例的個位數。 要獲得所需的 output,您可以在字符數上再添加一個條件,如下所示:

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)
}

output:

fun_1(y2)
year  is  4 
Year post changes 2004 

我添加了 cat 步驟只是為了檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM