В настоящее время я работаю над сценарием, который создает блок/диапазон кода МКБ-10 на основе данного кода МКБ-10. Я добился некоторого прогресса для тех, у кого есть четыре или более символов, но если данный код ICD-10 является трехзначным кодом, мой код регулярного выражения не работает должным образом. Похоже, проблема связана с периодом между буквенно-цифровыми кодами. Вот мой текущий код:
icd10 <- data.frame(
stringsAsFactors = FALSE,
check.names = FALSE,
`icd10_codes` = c("A00-A09.9","A00.1","A01.2","A00-A09.9","A04.4",
"A00","A05","A00-A09.9","A03.2")) %>%
# Identify the ICD-10 Block Codes
mutate(icdrange = case_when(
grepl('^([a-zA-Z0-9]*-[a-zA-Z0-9]*)+$', icd10_codes) ~ icd10_codes, # if ICD-10 code is already a block code, use it as the ICD-10 range
grepl('^([aA][0][0-9][.]*[0-9][0-9]*)+$', icd10_codes) ~ "A00-A09.9",
grepl('^([aA][1][5-9][.]*[0-9][0-9]*)+$', icd10_codes) ~ "A15.0-A19.9",
grepl('^([aA][2][7][.]*[0-9][0-9]*)+$', icd10_codes) ~ "A27.0-A27.9",
grepl('^([aA][3-4][0-9][.]*[0-9][0-9]*)+$', icd10_codes) ~ "A30-A49.9",
grepl('^([aA][8][0-9][.]*[0-9][0-9]*)+$', icd10_codes) ~ "A80-A89"
))
A01.1 следует назначить A00-A09.9 (в настоящее время это работает) A00 следует назначить A00-A09.9 (в настоящее время не работает)
Надеюсь, вы сможете помочь. Спасибо!
Нужна ли обратная косая черта перед точкой [\.]
Я попробовал, и это не работает. регулярное выражение, которое я хочу, должно работать с периодом между буквенно-цифровыми кодами или без него, поэтому, если у меня есть A00 (без точки), оно все равно должно классифицировать его как блок/диапазон A00-A09.9.





A01.1 следует назначить A00-A09.9 (в настоящее время это работает) A00 должен быть назначен A00-A09.9 (в настоящее время не работает)
Это утверждение будет исправлено следующим регулярным выражением. Хотя цель вашего бизнеса не совсем ясна, поэтому я оставил последний + в этом регулярном выражении, как вы и хотели.
^([aA][0][0-9]([.][0-9])?[0-9]?)+$
Объяснение:
([.][0-9])? гарантирует, что если . существует, за ним следует 1 цифра.
Финальный ? гарантирует, что .digit не является обязательным.[0-9]? — гарантирует, что последняя цифра также является необязательной.* на ?, потому что не совсем понятно, почему вам нужен ноль или больше, если вы хотите оставить это необязательным.Огромное спасибо за код и объяснение! :)
В первом случае вы можете использовать ^([a-zA-Z][0-9]{2}-[a-zA-Z][0-9]{2}).
Для остальных можно использовать ^[aA][0][0-9]([.][0-9])?$
# Identify the ICD-10 Block Codes
df %>% mutate(icdrange = case_when(
# if ICD-10 code is already a block code, use it as the ICD-10 range
grepl('^([a-zA-Z][0-9]{2}-[a-zA-Z][0-9]{2})', icd10_codes) ~ icd10_codes,
grepl('^[aA][0][0-9]([.][0-9])?$', icd10_codes) ~ "A00-A09.9",
grepl('^[aA][1][5-9]([.][0-9])?$', icd10_codes) ~ "A15.0-A19.9",
grepl('^[aA][2][7]([.][0-9])?$', icd10_codes) ~ "A27.0-A27.9",
grepl('^[aA][3-4][0-9]([.][0-9])?$', icd10_codes) ~ "A30-A49.9",
grepl('^[aA][8][0-9]([.][0-9])?$', icd10_codes) ~ "A80-A89"
))
icd10_codes icdrange
1 A00-A09.9 A00-A09.9
2 A00.1 A00-A09.9
3 A01.2 A00-A09.9
4 A00-A09.9 A00-A09.9
5 A04.4 A00-A09.9
6 A00 A00-A09.9
7 A05 A00-A09.9
8 A00-A09.9 A00-A09.9
9 A03.2 A00-A09.9
Спасибо за ответ на мой вопрос! Обновленный код работал очень хорошо. :)
Пожалуйста, сделайте это полным вопросом, включив примеры кодов для обеих ветвей вызова
case_when().