Skip to contents

Maps comorbidity conditions using algorithms from the Charlson and the Elixhauser comorbidity scores.

Usage

comorbidity(x, id, code, map, assign0, labelled = TRUE, tidy.codes = TRUE)

Arguments

x

A tidy data.frame (or a data.table; tibbles are supported too) with one column containing an individual ID and a column containing all diagnostic codes. Extra columns other than ID and codes are discarded. Column names must be syntactically valid names, otherwise they are forced to be so by calling the make.names() function.

id

String denoting the name of a column of x containing the individual ID.

code

String denoting the name of a column of x containing diagnostic codes. Codes must be in upper case with no punctuation in order to be properly recognised.

map

String denoting the mapping algorithm to be used (values are case-insensitive). Possible values are the Charlson score with either ICD-10 or ICD-9-CM codes (charlson_icd10_quan, charlson_icd9_quan) and the Elixhauser score, again using either ICD-10 or ICD-9-CM (elixhauser_icd10_quan, elixhauser_icd9_quan). These mapping are based on the paper by Quan et al. (2011). It is also possible to obtain a Swedish (charlson_icd10_se) or Australian (charlson_icd10_am) modification of the Charlson score using ICD-10 codes.

assign0

Logical value denoting whether to apply a hierarchy of comorbidities: should a comorbidity be present in a patient with different degrees of severity, then the milder form will be assigned a value of 0. By doing this, a type of comorbidity is not counted more than once in each patient. If assign0 = TRUE, the comorbidities that are affected by this argument are:

  • "Mild liver disease" (mld) and "Moderate/severe liver disease" (msld) for the Charlson score;

  • "Diabetes" (diab) and "Diabetes with complications" (diabwc) for the Charlson score;

  • "Cancer" (canc) and "Metastatic solid tumour" (metacanc) for the Charlson score;

  • "Hypertension, uncomplicated" (hypunc) and "Hypertension, complicated" (hypc) for the Elixhauser score;

  • "Diabetes, uncomplicated" (diabunc) and "Diabetes, complicated" (diabc) for the Elixhauser score;

  • "Solid tumour" (solidtum) and "Metastatic cancer" (metacanc) for the Elixhauser score.

labelled

Logical value denoting whether to attach labels to each comorbidity, which are compatible with the RStudio viewer via the utils::View() function. Defaults to TRUE.

tidy.codes

Logical value, defaulting to TRUE, denoting whether ICD codes are to be tidied. If TRUE, all codes are converted to upper case and all non-alphanumeric characters are removed using the regular expression [^[:alnum:]]. It can be set to FALSE to speed up computations, but please be aware that in that case codes are assumed to be formatted as above. If codes are incorrectly formatted, this may lead to wrong results: use at your own risk!

Value

A data frame with id and columns relative to each comorbidity domain, with one row per individual.

For the Charlson score, the following variables are included in the dataset:

  • The id variable as defined by the user;

  • mi, for myocardial infarction;

  • chf, for congestive heart failure;

  • pvd, for peripheral vascular disease;

  • cevd, for cerebrovascular disease;

  • dementia, for dementia;

  • cpd, for chronic pulmonary disease;

  • rheumd, for rheumatoid disease;

  • pud, for peptic ulcer disease;

  • mld, for mild liver disease;

  • diab, for diabetes without complications;

  • diabwc, for diabetes with complications;

  • hp, for hemiplegia or paraplegia;

  • rend, for renal disease;

  • canc, for cancer (any malignancy);

  • msld, for moderate or severe liver disease;

  • metacanc, for metastatic solid tumour;

  • aids, for AIDS/HIV. Please note that we combine "chronic obstructive pulmonary disease" and "chronic other pulmonary disease" for the Swedish version of the Charlson index, for comparability (and compatibility) with other definitions/implementations.

Conversely, for the Elixhauser score the dataset contains the following variables:

  • The id variable as defined by the user;

  • chf, for congestive heart failure;

  • carit, for cardiac arrhythmias;

  • valv, for valvular disease;

  • pcd, for pulmonary circulation disorders;

  • pvd, for peripheral vascular disorders;

  • hypunc, for hypertension, uncomplicated;

  • hypc, for hypertension, complicated;

  • para, for paralysis;

  • ond, for other neurological disorders;

  • cpd, for chronic pulmonary disease;

  • diabunc, for diabetes, uncomplicated;

  • diabc, for diabetes, complicated;

  • hypothy, for hypothyroidism;

  • rf, for renal failure;

  • ld, for liver disease;

  • pud, for peptic ulcer disease, excluding bleeding;

  • aids, for AIDS/HIV;

  • lymph, for lymphoma;

  • metacanc, for metastatic cancer;

  • solidtum, for solid tumour, without metastasis;

  • rheumd, for rheumatoid arthritis/collaged vascular disease;

  • coag, for coagulopathy;

  • obes, for obesity;

  • wloss, for weight loss;

  • fed, for fluid and electrolyte disorders;

  • blane, for blood loss anaemia;

  • dane, for deficiency anaemia;

  • alcohol, for alcohol abuse;

  • drug, for drug abuse;

  • psycho, for psychoses;

  • depre, for depression;

Labels are presented to the user when using the RStudio viewer (e.g. via the utils::View() function) for convenience, if labelled = TRUE.

Details

The ICD-10 and ICD-9-CM coding for the Charlson and Elixhauser scores is based on work by Quan et al. (2005). ICD-10 and ICD-9 codes must be in upper case and with alphanumeric characters only in order to be properly recognised; set tidy.codes = TRUE to properly tidy the codes automatically (this is the default behaviour). A message is printed to the R console when non-alphanumeric characters are found.

References

Quan H, Sundararajan V, Halfon P, Fong A, Burnand B, Luthi JC, et al. Coding algorithms for defining comorbidities in ICD-9-CM and ICD-10 administrative data. Medical Care 2005; 43(11):1130-1139.

Charlson ME, Pompei P, Ales KL, et al. A new method of classifying prognostic comorbidity in longitudinal studies: development and validation. Journal of Chronic Diseases 1987; 40:373-383.

Ludvigsson JF, Appelros P, Askling J et al. Adaptation of the Charlson Comorbidity Index for register-based research in Sweden. Clinical Epidemiology 2021; 13:21-41.

Sundararajan V, Henderson T, Perry C, Muggivan A, Quan H, Ghali WA. New ICD-10 version of the Charlson comorbidity index predicted in-hospital mortality. Journal of Clinical Epidemiology 2004; 57(12):1288-1294.

Examples

set.seed(1)
x <- data.frame(
  id = sample(1:15, size = 200, replace = TRUE),
  code = sample_diag(200),
  stringsAsFactors = FALSE
)

# Charlson score based on ICD-10 diagnostic codes:
comorbidity(x = x, id = "id", code = "code", map = "charlson_icd10_quan", assign0 = FALSE)
#>    id mi chf pvd cevd dementia cpd rheumd pud mld diab diabwc hp rend canc msld
#> 1   1  0   0   0    0        0   0      0   0   0    0      0  0    0    1    0
#> 2   2  0   0   0    0        0   0      0   0   0    0      0  0    0    0    0
#> 3   3  0   0   0    0        0   0      0   0   0    0      0  0    0    0    0
#> 4   4  0   0   0    0        0   0      0   0   0    0      0  0    0    1    0
#> 5   5  0   0   0    0        0   0      0   0   0    0      0  0    0    0    0
#> 6   6  0   0   0    0        0   0      0   0   0    0      0  0    0    0    0
#> 7   7  0   1   0    0        0   0      0   0   1    0      0  0    0    1    0
#> 8   8  0   0   0    0        0   0      0   0   0    0      0  0    0    0    0
#> 9   9  0   0   0    1        0   0      0   0   0    0      0  0    0    1    0
#> 10 10  0   0   0    0        0   0      0   0   0    0      0  0    0    1    0
#> 11 11  0   0   0    0        0   0      0   0   0    0      0  0    0    0    0
#> 12 12  0   0   0    0        0   0      0   0   0    0      0  0    0    0    0
#> 13 13  0   0   0    0        0   0      0   1   0    0      0  0    0    1    0
#> 14 14  0   0   0    0        0   0      0   0   0    0      0  0    0    0    0
#> 15 15  0   0   0    0        0   0      0   0   0    0      0  0    0    1    0
#>    metacanc aids
#> 1         0    0
#> 2         0    1
#> 3         0    0
#> 4         0    0
#> 5         0    0
#> 6         0    0
#> 7         0    0
#> 8         0    0
#> 9         0    0
#> 10        0    0
#> 11        0    0
#> 12        0    0
#> 13        0    0
#> 14        0    0
#> 15        0    0

# Elixhauser score based on ICD-10 diagnostic codes:
comorbidity(x = x, id = "id", code = "code", map = "elixhauser_icd10_quan", assign0 = FALSE)
#>    id chf carit valv pcd pvd hypunc hypc para ond cpd diabunc diabc hypothy rf
#> 1   1   0     0    0   0   0      0    0    0   0   0       0     0       1  0
#> 2   2   0     0    1   0   0      0    0    0   0   0       0     0       0  0
#> 3   3   0     0    0   0   0      0    0    0   0   0       0     0       0  0
#> 4   4   0     0    0   0   0      0    0    0   0   0       0     0       0  0
#> 5   5   0     0    0   0   0      0    0    0   0   0       0     0       0  0
#> 6   6   0     0    0   0   0      0    0    0   0   0       0     0       0  0
#> 7   7   1     0    0   0   0      0    0    0   0   0       0     0       0  0
#> 8   8   0     0    0   0   0      0    0    0   0   0       0     0       0  0
#> 9   9   0     0    0   0   0      0    0    0   0   0       0     0       0  0
#> 10 10   0     0    0   0   0      0    0    0   0   0       0     0       0  0
#> 11 11   0     0    0   0   0      0    0    0   0   0       0     0       0  0
#> 12 12   0     0    0   0   0      0    0    0   1   0       0     0       0  0
#> 13 13   0     0    0   0   0      0    0    0   0   0       0     0       0  0
#> 14 14   0     0    0   0   0      0    0    0   0   0       0     0       0  0
#> 15 15   0     0    0   0   0      0    0    0   0   0       0     0       0  0
#>    ld pud aids lymph metacanc solidtum rheumd coag obes wloss fed blane dane
#> 1   0   0    0     0        0        1      0    0    0     0   0     0    0
#> 2   0   0    1     0        0        0      0    0    0     0   0     0    0
#> 3   0   0    0     0        0        0      0    0    0     0   0     0    0
#> 4   0   0    0     0        0        0      0    0    0     0   0     0    0
#> 5   0   0    0     0        0        0      0    0    0     0   0     0    0
#> 6   0   0    0     0        0        0      0    0    0     0   0     0    0
#> 7   1   0    0     0        0        1      0    0    0     0   0     0    0
#> 8   0   0    0     0        0        0      0    0    0     0   0     0    0
#> 9   0   0    0     0        0        1      1    0    0     0   0     0    0
#> 10  0   0    0     0        0        1      0    0    0     0   0     0    0
#> 11  0   0    0     0        0        0      0    0    0     0   0     0    0
#> 12  0   0    0     0        0        0      0    1    0     0   0     0    0
#> 13  0   1    0     0        0        1      0    0    0     0   0     0    0
#> 14  0   0    0     0        0        0      0    0    0     0   0     0    0
#> 15  0   0    0     0        0        1      0    0    0     0   0     0    0
#>    alcohol drug psycho depre
#> 1        0    0      0     0
#> 2        0    0      0     0
#> 3        0    0      0     0
#> 4        0    0      0     0
#> 5        0    0      0     0
#> 6        0    0      0     0
#> 7        1    0      0     0
#> 8        0    0      0     0
#> 9        0    0      0     0
#> 10       0    0      0     0
#> 11       0    0      0     0
#> 12       0    1      1     0
#> 13       0    0      0     0
#> 14       0    0      0     0
#> 15       0    0      0     0

# The following example describes how the `assign0` argument works.
# We create a dataset for a single patient with two codes, one for
# uncomplicated diabetes ("E100") and one for complicated diabetes
# ("E102"):
x2 <- data.frame(
  id = 1,
  code = c("E100", "E102"),
  stringsAsFactors = FALSE
)
# Then, we calculate the Quan-ICD10 Charlson score:
ccF <- comorbidity(x = x2, id = "id", code = "code", map = "charlson_icd10_quan", assign0 = FALSE)
# With `assign0 = FALSE`, both diabetes comorbidities are counted:
ccF[, c("diab", "diabwc")]
#>   diab diabwc
#> 1    1      1
# Conversely, with `assign0 = TRUE`, only the more severe diabetes with
# complications is counted:
ccT <- comorbidity(x = x2, id = "id", code = "code", map = "charlson_icd10_quan", assign0 = TRUE)
ccT[, c("diab", "diabwc")]
#>   diab diabwc
#> 1    0      1