Один из вариантов - выполнить извлечение на основе поиска по регулярному выражению с помощью str_extract
, а затем вычислить total_month. less than a year
заменяется на '11 mo ', как обновлено в сообщении OP
library(dplyr)
library(stringr)
library(tidyr)
dat %>%
mutate(col1 = replace(col1, col1 == 'less than a year', '11 mos'),
month = as.numeric(str_extract(col1, "\\d+(?= mo)")),
year = replace_na(as.numeric(str_extract(col1, "\\d+(?= yr)")), 0),
totalmonth = month + year * 12)
# col1 month year totalmonth
#1 2 yrs 1 mo 1 2 25
#2 1 yr 1 mo 1 1 13
#3 2 yrs 4 mos 4 2 28
#4 11 mos 11 0 11
#5 10 mos 10 0 10
Или другой вариант - использовать extract
dat %>%
mutate(col1 = case_when(col1 == 'less than a year' ~ '0 yr 11 mos',
str_detect(col1, '^\\d+\\s+mo')~ str_c('0 yr ', col1), TRUE ~ col1)) %>%
extract(col1, into = c('year', 'month'), "^(\\d+)\\s*yrs?\\s*(\\d+).*",
convert = TRUE, remove = FALSE) %>%
mutate(totalmonth = month + year * 12)
данные
dat <- structure(list(col1 = c("2 yrs 1 mo", "1 yr 1 mo", "2 yrs 4 mos",
"less than a year", "10 mos")), row.names = c(NA, -5L), class = "data.frame")