【问题标题】:Parse string, extract two-digit year and complete into four digit format解析字符串,提取两位数年份并完成成四位数格式
【发布时间】:2020-05-07 09:59:35
【问题描述】:

我有类似的字符串

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 年(测试用例 y2y4)。

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

【问题讨论】:

    标签: r readr


    【解决方案1】:

    使用一些基本的正则表达式,您可以删除不是数字的所有内容,并将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
    

    【讨论】:

      【解决方案2】:

      数字没有前导 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

      【讨论】:

        【解决方案3】:

        parse_number 将返回 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 步骤只是为了检查。

        【讨论】:

          猜你喜欢
          • 2011-01-02
          • 1970-01-01
          • 2016-05-26
          • 1970-01-01
          • 1970-01-01
          • 2010-12-11
          • 1970-01-01
          • 1970-01-01
          • 2023-01-24
          相关资源
          最近更新 更多