Подсчет строковых совпадений в соответствии с целевым вектором по строкам во фрейме данных

У меня большой набор данных (~ 520 000 строк и 1000 столбцов). Подмножеством этих столбцов являются коды МКБ. Я хотел бы выполнить сумму для каждой строки (среди подмножества столбцов, содержащих коды МКБ), которая подсчитывает все столбцы, для которых запись кода МКБ соответствует списку интересующих кодов МКБ. Затем я хотел бы создать новый индикаторный столбец, в котором значение равно 1, если сумма строк больше 0 (т. е. если какой-либо столбец имеет код ICD, соответствующий моему списку) и 0, если нет столбцов с записями, соответствующими целевому списку. кодов МКБ. Вот простой воспроизводимый пример с поддельным набором данных:

# create fake dataset
id <- c(500, 550, 560)
icd.1 <- c("C00", "F14", "H15")
icd.2 <- c("F10", "G45", "A40")
icd.3 <- c(NA, "A16", "F13")
dat <- as.data.frame(cbind(id, icd.1, icd.2, icd.3))

# vector of ICD codes to search for
icd_include <- c("C00", "G46", "A16", "F13")

# vector of column names to search
icd_all <- paste0("icd.", seq(1,3))

Если у меня есть значение одного символа, которому я хочу сопоставить, то rowSums дает мне идеальное решение:

dat$event <- ifelse(rowSums(dat[icd_all] == "C00") > 0,
                    1,
                    0)

dat
   id icd.1 icd.2 icd.3 event
1 500   C00   F10   <NA>    1
2 550   F14   G45   A16     0
3 560   H15   A40   F13     0

Я хочу выполнить rowSums для совпадений со всеми записями в векторе icd_include, чтобы получить следующий результат:

   id icd.1 icd.2 icd.3 event
1 500   C00   F10   <NA>    1
2 550   F14   G45   A16     1
3 560   H15   A40   F13     1

Однако я не могу заставить это работать при попытке сопоставить вектор многих возможных строк. На мой взгляд, логичным способом попробовать это было бы использование следующего кода:

dat$event <- ifelse(rowSums(dat[icd_all] %in% icd_include, na.rm = TRUE) > 0,
                    1,
                    0)

Но это не работает и выдает следующую ошибку:

Error in rowSums(dat[icd_all] %in% icd_include) : 
  'x' must be an array of at least two dimensions

Текущее обходное решение, которое у меня есть, состоит в том, чтобы создать фиктивный столбец для каждого столбца кодов ICD, а затем выполнить для них rowSums:

dat$event.1 <- ifelse(dat[[icd_all[1]]] %in% icd_include,
                      1,
                      0)

dat$event.2 <- ifelse(dat[[icd_all[2]]] %in% icd_include,
                      1,
                      0)

dat$event.3 <- ifelse(dat[[icd_all[3]]] %in% icd_include,
                      1,
                      0)

dat$event <- ifelse(rowSums(dat[event.1:event.3],
                            na.rm = TRUE) > 0,
                    1,
                    0)

Но мне это кажется очень неуклюжим, и мне нужен более простой метод, в котором мне не нужно создавать все эти фиктивные столбцы. Может ли кто-нибудь предложить способ кодирования этого? Я пробовал множество способов и тщательно искал в Интернете, но безрезультатно. Предлагаемые решения в базе R или data.table (для ускорения вычислений) будут особенно оценены.


person Austin    schedule 28.02.2021    source источник
comment
Спасибо, @RonakShah! Это сработало отлично. И очень быстро, несмотря на большой набор данных.   -  person Austin    schedule 28.02.2021