У меня есть фрейм данных со строковой переменной, представляющей диагнозы заболеваний.Я хочу классифицировать диагнозы в соответствии с некоторыми правилами:
rules <- list(
group1 = c('A012', 'A02', 'C30'),
group2 = c('B01', 'B02')
)
Если поле диагностики содержит «A01», «A02» или «A03» (включая текст, содержащий эти шаблоны, например, «A0199»),затем дело следует поместить в группу 1 и т. д.
Мои данные выглядят так:
dat <- data.frame(
ID = seq_len(10),
diagnosis = c('A012', 'A01', 'B23', 'C43', 'B023', 'A99', 'A023', 'B012', 'B04', 'A07')
)
Метод, который я использовал, выглядит следующим образом:
# modify the rules so they work with grep
rules <- lapply(rules, paste, collapse = '|')
# create a function that classifies an individual diagnosis
group <- function(y) {
a <- sapply(rules, grepl, x = y)
a <- names(a)[a]
return(if (length(a) == 0) NA else a)
}
# apply the function across the data frame
dat$group <- sapply(dat$diagnosis, group)
Кажется, это работает, но мой набор данных большой, и есть много правил, и он очень медленный!
Есть ли более быстрые способы, которыми я мог бы сделать это?