У меня большой набор данных (~ 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 (для ускорения вычислений) будут особенно оценены.