R: сопоставить элементы фрейма данных с векторными элементами - PullRequest
0 голосов
/ 05 декабря 2018

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

dx1   dx2   dx3  ...  dx15
4210  3359  2214      8178
V0832 12218 7423      2294
6463  3438  3243      1129

к чему-то вроде этого:

dx1   dx2   dx3  ...  dx15  ENDO
4210  3359  4211      8178  TRUE
V0832 12218 7423      2294  TRUE
6463  3438  E3243      1129  FALSE

Я создал вектор со своими интересующими кодами:

ICD9EndoCodes <-c("4210","4211","4219","4249","421","11281")

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

x <-ifelse(df_04_13[,4:18] == "4210", TRUE, FALSE)

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

x <- for(i in 1:length(ICD9EndoCodes)) 
     ifelse(df_04_13[,4:18] == ICD9EndoCodes[i], TRUE, FALSE)

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

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Вот пример одного способа без изменения формы ваших данных:

dat <- read.table(text="id dx1   dx2   dx3  dx15
1 4210  3359  2214  8178
2 V0832 12218 7423  2294
3 6463  3438  3243  1129", header=TRUE, stringsAsFactors=FALSE)

Выполните цикл по каждому столбцу и проверьте, совпадают ли какие-либо значения с кодом ICD в вашем списке.Затем сверните с помощью Reduce() каждый из этих индикаторов столбцов, используя функцию |, которая представляет «ИЛИ», чтобы получить индикатор уровня строки:

Reduce(`|`, lapply(dat[2:5], `%in%`, ICD9EndoCodes))
#[1]  TRUE FALSE FALSE

Хотя я подозреваю, что этот тип данных болеелегко работал в «длинной» форме в долгосрочной перспективе (каламбур).Скорее всего, это гораздо более эффективный и гибкий способ хранения кодов МКБ, если у большинства пациентов имеется только 1 или 2 диагноза, а каждый не получает записанную униформу 15.

Флаг / агрегат / слияние.Эта логика будет работать независимо от того, есть ли у вас столбец 1 dxN, 15 или 115, поскольку теперь все они свернуты в один столбец.Например:

long <- cbind(dat[1], stack(dat[-1]))

# flag
long$icdhit <- long$values %in% ICD9EndoCodes

# aggregate
icdagg <- aggregate(icdhit ~ id, data=long, FUN=any)
#  id icdhit
#1  1   TRUE
#2  2  FALSE
#3  3  FALSE

# merge
merge(dat, icdagg, by="id", all.x=TRUE)
#  id   dx1   dx2  dx3 dx15 icdhit
#1  1  4210  3359 2214 8178   TRUE
#2  2 V0832 12218 7423 2294  FALSE
#3  3  6463  3438 3243 1129  FALSE
0 голосов
/ 10 декабря 2018

Пакет icd , автором которого я являюсь, делает именно это:

library(icd) pts <- data.frame(id = c("pt1", "pt2"), dx1 = c("410", "V10"), dx2 = c("4219", "11281"), stringsAsFactors = FALSE) ICD9EndoCodes <-c("4210","4211","4219","4249","421","11281") res <- icd::comorbid(pts, map = list(endo = ICD9EndoCodes)) cbind(pts, res) id dx1 dx2 endo pt1 pt1 410 4219 TRUE pt2 pt2 V10 11281 TRUE Во введении * 1008 есть примеры расчета сопутствующей патологии.* и другая документация с использованием пользовательской карты (как в этом примере) и стандартных отображений от Elixhauser, Quan, Charlson и т. д.

0 голосов
/ 05 декабря 2018

Вот одно решение с использованием tidyverse:

df %>%
 mutate_all(funs(ifelse(. %in% ICD9EndoCodes, 1, 0))) %>% #Comparing the values in df with the values in the vector and assigning 1 when there is a match
 mutate(ENDO = ifelse(rowSums(.) >= 1, TRUE, FALSE)) %>% #Counting the number of matches
 select(ENDO) %>%
 rowid_to_column() %>%
 left_join(df %>%
            rowid_to_column(), by = c("rowid" = "rowid")) %>% #Merging the results with the original df
 select(-rowid)

   ENDO   dx1   dx2  dx3 dx15
1  TRUE  4210  4211 2214 8178
2 FALSE V0832 12218 7423 2294
3 FALSE  6463  3438 3243 1129

Пример данных:

df <- read.table(text = "dx1   dx2   dx3 dx15
4210  4211  2214      8178
           V0832 12218 7423      2294
           6463  3438  3243      1129", header = TRUE)

ICD9EndoCodes = c("4210","4211","4219","4249","421","11281")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...