Отделить числа от символов в переменной несогласованной длины -R - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь подсчитать количество месяцев опыта, но в настоящее время моя переменная выглядит примерно так, как показано ниже, где годы и месяцы указаны в одном столбце.

2 yrs 1 mo
1 yr 1 mo
2 yrs 4 mos
less than a year
10 mos

Я хотел бы отделить годы и месяцы друг от друга, чтобы затем я мог рассчитать общее количество месяцев опыта. Мои попытки до сих пор были неизящными, а substring не очень помог, поскольку длина не соответствует. Есть идеи, как я мог это сделать?

РЕДАКТИРОВАТЬ : Для less than a year я думаю заменить его на 11 месяцев

1 Ответ

1 голос
/ 07 мая 2020

Один из вариантов - выполнить извлечение на основе поиска по регулярному выражению с помощью 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...