/icdcoder

R package: ICD-9 and ICD-10 code utility functions and datasets

Primary LanguageR

icdcoder

ICD-9 and ICD-10 code utility functions and datasets

Overview

Utility functions to work with and between ICD-9 and ICD-10, along with datasets that provide the hierarchies for the ICD chapters, comorbidities, and CMS GEMs (for conversions). Includes functions to validate, get all codes within a range, all children of a code level, mappings to convert to/from icd9 and icd10 (CMS GEMs), and get comorbidities. Comorbidities (Elixhauser and Charlson from Quan et al. (2005), and Royal College of Surgeons Charlson) are based upon the comorbidities.icd10 package (https://github.com/gforge/comorbidities.icd10), and the dataset for the hierarchy of icd9 codes is taken directly from the icd9 package (https://github.com/jackwasey/icd9).

Installation

library(devtools) 
devtools::install_github("wtcooper/icdcoder")

Example Use

require(devtools)
require(dplyr)
require(data.table)
require(icdcoder)

## Set up example dataset
dat = data.table(patient=c(1,1,1,1,2,2,2,2), icdVer=c(9,9,9,10,9,9,10,10), code=c("042", "0703333", "140", "A520", "2038", "40403", "C008",  "E1010"))

## Check if codes are valid (2nd icd9 code not)
isValidICD((dat %>% filter(icdVer==9))$code, "icd9")
isValidICD((dat %>% filter(icdVer==10))$code, "icd10")

## Get a range of values...it's inclusive
getICDRange("001","002", "icd9")  		# return 001-002
getICDRange("001","001999999", "icd9")  # eg non-inclusive endpoint
getICDRange("A00","A03", "icd10")  		# icd10 codes in range


## Get children under a hierarchy
getICDChildren("001", "icd9")			# similar to range above but doesn't include 001
getICDChildren("A01", "icd10")			

## Convert codes using the GEMs
convICD("0011", "icd9")
convICD("A001", "icd10")

# note: parent codes don't convert so will return NAs for invalid or parent codes
convICD((dat %>% filter(icdVer==9))$code, "icd9")
convICD((dat %>% filter(icdVer==10))$code, "icd10")


## Get comorbidities
getComorbids((dat %>% filter(icdVer==9))$code, "icd9")
getComorbids((dat %>% filter(icdVer==10))$code, "icd10")


## roll out Elixhauser comorbidities to dummy codes
d = getComorbids((dat %>% filter(icdVer==9))$code, "icd9", type="Elixhauser")
datComorbs = dat %>% 
    filter(icdVer==9) %>% 
    rename(icd9=code) %>%
    left_join(d, by="icd9") %>% 
    filter(!is.na(Elixhauser))

datComorbs %>% 
    group_by(patient) %>%
    select(Elixhauser) %>%
    table() %>%
    as.data.frame.matrix()