Функция case_when()
из dplyr
может обеспечить удобочитаемую альтернативу вложенным ifelse
блокам.stringi
на самом деле не нужен (grepl
будет работать нормально), но мне нравится выразительная природа stringi
имен функций (а stringr
- ненужный костыль IMO):
library(stringi)
library(tidyverse)
read.csv(text="datecolumn,HMS
2000-11-21 10:01:01,HMS
2000-11-21 00:02:01,MS
2000-11-21 00:00:06,S
2000-11-21 00:00:10,S
2000-11-21 00:10:06,MS
2000-11-21 00:00:07,S
2000-11-21 10:00:06,HMS", stringsAsFactors=FALSE) -> xdf
Обратите внимание, чтопорядок здесь имеет значение:
mutate(xdf, computed_hms = case_when(
stri_detect_regex(datecolumn, "00:00:[[:digit:]]{2}") ~ "S",
stri_detect_regex(datecolumn, "00:[[:digit:]]{2}:[[:digit:]]{2}") ~ "MS",
stri_detect_regex(datecolumn, "[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}") ~ "HMS"
TRUE ~ NA_character_
))
## datecolumn HMS computed_hms
## 1 2000-11-21 10:01:01 HMS HMS
## 2 2000-11-21 00:02:01 MS MS
## 3 2000-11-21 00:00:06 S S
## 4 2000-11-21 00:00:10 S S
## 5 2000-11-21 00:10:06 MS MS
## 6 2000-11-21 00:00:07 S S
## 7 2000-11-21 10:00:06 HMS HMS