Разобрать строку, извлечь два-ди git год и завершить в формате четыре ди git - PullRequest
0 голосов
/ 07 мая 2020

У меня есть такие строки, как

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

, где мне нужно извлечь два di git год и завершить его в формате четырех di git. Диапазон ввода от 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).

Какие функции могут помочь мне нормально работать в те годы?

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Используя базовое c регулярное выражение, вы можете удалить все, что не является числом, и применить 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
1 голос
/ 07 мая 2020

Число не начинается с 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.

0 голосов
/ 07 мая 2020

parse_number вернет 4, single di git номер случая 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)
}

output:

fun_1(y2)
year  is  4 
Year post changes 2004 

Я добавил шаг cat только для проверок.

...