import polars as pl
from csrlite import count_subject, count_subject_with_observation15 Count
Objective
Add examples to illustrate helper functions to count subject / records”
adsl = pl.read_parquet("data/adsl.parquet")
adae = pl.read_parquet("data/adae.parquet")16 Population
df = count_subject(
population = adsl,
id = "USUBJID",
group = "TRT01A",
)
df
shape: (4, 2)
| TRT01A | n_subj_pop |
|---|---|
| enum | u32 |
| "Placebo" | 86 |
| "Xanomeline High Dose" | 84 |
| "Xanomeline Low Dose" | 84 |
| "Total" | 254 |
(
df.
with_columns(pl.lit("Subjects in Population").alias("label")).
pivot(index = "label", on = "TRT01A", values = "n_subj_pop")
)
shape: (1, 5)
| label | Placebo | Xanomeline High Dose | Xanomeline Low Dose | Total |
|---|---|---|---|---|
| str | u32 | u32 | u32 | u32 |
| "Subjects in Population" | 86 | 84 | 84 | 254 |
17 Observation
df = count_subject_with_observation(
population = adsl,
observation = adae,
id = "USUBJID",
group = "TRT01A",
variable = "AESOC"
)
df
shape: (92, 11)
| __id__ | TRT01A | AESOC | n_obs | n_subj | n_subj_pop | pct_subj | pct_subj_fmt | n_subj_fmt | n_pct_subj_fmt | __variable__ |
|---|---|---|---|---|---|---|---|---|---|---|
| u32 | enum | str | u32 | u32 | u32 | f64 | str | str | str | str |
| 1 | "Placebo" | "CARDIAC DISORDERS" | 27 | 13 | 86 | 15.116279 | " 15.1" | " 13" | " 13 ( 15.1)" | "CARDIAC DISORDERS" |
| 2 | "Placebo" | "CONGENITAL, FAMILIAL AND GENET… | 0 | 0 | 86 | 0.0 | " 0.0" | " 0" | " 0 ( 0.0)" | "CONGENITAL, FAMILIAL AND GENET… |
| 3 | "Placebo" | "EAR AND LABYRINTH DISORDERS" | 2 | 1 | 86 | 1.162791 | " 1.2" | " 1" | " 1 ( 1.2)" | "EAR AND LABYRINTH DISORDERS" |
| 4 | "Placebo" | "EYE DISORDERS" | 8 | 4 | 86 | 4.651163 | " 4.7" | " 4" | " 4 ( 4.7)" | "EYE DISORDERS" |
| 5 | "Placebo" | "GASTROINTESTINAL DISORDERS" | 26 | 17 | 86 | 19.767442 | " 19.8" | " 17" | " 17 ( 19.8)" | "GASTROINTESTINAL DISORDERS" |
| … | … | … | … | … | … | … | … | … | … | … |
| 88 | "Total" | "RESPIRATORY, THORACIC AND MEDI… | 53 | 30 | 254 | 11.811024 | " 11.8" | " 30" | " 30 ( 11.8)" | "RESPIRATORY, THORACIC AND MEDI… |
| 89 | "Total" | "SKIN AND SUBCUTANEOUS TISSUE D… | 276 | 105 | 254 | 41.338583 | " 41.3" | "105" | "105 ( 41.3)" | "SKIN AND SUBCUTANEOUS TISSUE D… |
| 90 | "Total" | "SOCIAL CIRCUMSTANCES" | 1 | 1 | 254 | 0.393701 | " 0.4" | " 1" | " 1 ( 0.4)" | "SOCIAL CIRCUMSTANCES" |
| 91 | "Total" | "SURGICAL AND MEDICAL PROCEDURE… | 5 | 5 | 254 | 1.968504 | " 2.0" | " 5" | " 5 ( 2.0)" | "SURGICAL AND MEDICAL PROCEDURE… |
| 92 | "Total" | "VASCULAR DISORDERS" | 13 | 8 | 254 | 3.149606 | " 3.1" | " 8" | " 8 ( 3.1)" | "VASCULAR DISORDERS" |
(
df
.pivot(index = "AESOC", on = "TRT01A", values = "n_pct_subj_fmt")
.sort("AESOC")
)
shape: (23, 5)
| AESOC | Placebo | Xanomeline High Dose | Xanomeline Low Dose | Total |
|---|---|---|---|---|
| str | str | str | str | str |
| "CARDIAC DISORDERS" | " 13 ( 15.1)" | " 18 ( 21.4)" | " 13 ( 15.5)" | " 44 ( 17.3)" |
| "CONGENITAL, FAMILIAL AND GENET… | " 0 ( 0.0)" | " 2 ( 2.4)" | " 1 ( 1.2)" | " 3 ( 1.2)" |
| "EAR AND LABYRINTH DISORDERS" | " 1 ( 1.2)" | " 1 ( 1.2)" | " 2 ( 2.4)" | " 4 ( 1.6)" |
| "EYE DISORDERS" | " 4 ( 4.7)" | " 1 ( 1.2)" | " 2 ( 2.4)" | " 7 ( 2.8)" |
| "GASTROINTESTINAL DISORDERS" | " 17 ( 19.8)" | " 21 ( 25.0)" | " 15 ( 17.9)" | " 53 ( 20.9)" |
| … | … | … | … | … |
| "RESPIRATORY, THORACIC AND MEDI… | " 10 ( 11.6)" | " 10 ( 11.9)" | " 10 ( 11.9)" | " 30 ( 11.8)" |
| "SKIN AND SUBCUTANEOUS TISSUE D… | " 21 ( 24.4)" | " 42 ( 50.0)" | " 42 ( 50.0)" | "105 ( 41.3)" |
| "SOCIAL CIRCUMSTANCES" | " 0 ( 0.0)" | " 1 ( 1.2)" | " 0 ( 0.0)" | " 1 ( 0.4)" |
| "SURGICAL AND MEDICAL PROCEDURE… | " 2 ( 2.3)" | " 2 ( 2.4)" | " 1 ( 1.2)" | " 5 ( 2.0)" |
| "VASCULAR DISORDERS" | " 3 ( 3.5)" | " 2 ( 2.4)" | " 3 ( 3.6)" | " 8 ( 3.1)" |