TLF Programming Explained: Tables, Listings and Figures in Clinical Trials
By Neha Jain, Principal Consultant and SAS trainer · 17+ years training in SAS · 5,000+ learners trained · Updated 7 November 2026
Tables, listings and figures — TLFs — are what reviewers actually read. Every dataset a clinical programmer builds eventually feeds them. This guide explains what TLFs are, how they are produced, the most common ones, and how they are programmed and validated in SAS and R.
The short answer
TLFs are the formatted results of a clinical trial: tables summarise data, listings show individual records, and figures show results visually. Programmers build them from ADaM datasets, following the statistical analysis plan and table shells, and every output is independently checked.

Tables, listings and figures
Type | What it shows | Examples |
Tables | Summary statistics by treatment group | Demographics, disposition, adverse event summary, lab shifts |
Listings | Individual subject records | Adverse events by subject, deaths, protocol deviations |
Figures | Results as graphs | Kaplan-Meier curves, mean change over time, forest plots |
Many companies number outputs following the ICH E3 structure for clinical study reports — for example, section 14 for tables and figures and section 16.2 for subject data listings.
How TLFs are produced
Statistical analysis plan (SAP). Defines populations, endpoints and statistical methods.
Table shells. Mock-ups showing the exact layout, titles, columns and footnotes of every output.
ADaM datasets. ADSL, ADAE, ADLB and other datasets provide analysis-ready data — see SDTM vs ADaM explained.
Programming. Production programmers write the code that creates each output.
Independent QC. A second programmer reproduces each output, and results are compared.
Review. Statisticians and medical writers review outputs before they go into the clinical study report.
The most common TLFs
Subject disposition and analysis populations
Demographics and baseline characteristics
Exposure to study treatment
Adverse events by system organ class and preferred term
Laboratory results and shift tables
Vital signs and change from baseline
Efficacy analyses, such as time-to-event with Kaplan-Meier figures
Programming a table in SAS
A simplified sex-by-treatment summary from ADSL, written to RTF:
ods rtf file="t_demog_sex.rtf" style=journal;
proc freq data=adam.adsl(where=(saffl="Y")) noprint;
tables trt01a*sex / out=sex_counts outpct;
run;
proc report data=sex_counts nowd;
column sex trt01a, (count pct_col);
define sex / group "Sex";
define trt01a / across "Treatment";
define count / analysis sum "n";
define pct_col / analysis sum format=5.1 "%";
run;
ods rtf close;Production tables add denominators, decimal alignment, titles, footnotes and page breaks — usually through standard company macros.
Programming TLFs in R
In R, teams use packages such as rtables, Tplyr and gtsummary to build tables, ggplot2 for figures, and r2rtf to write RTF output. The logic mirrors SAS: summarise ADaM data by treatment, format it to the shell, and export. See SAS vs R in clinical trials.
Validating TLFs
Most teams validate by independent double programming: the QC programmer creates the same numbers from ADaM and compares them with the production output, often by comparing datasets with PROC COMPARE. Any difference is investigated and resolved before the output is final.
Common TLF mistakes
Using the wrong population or denominator.
Counting events instead of subjects in AE tables.
Rounding differences between production and QC.
Footnotes or titles that don't match the shell or SAP.
Hard-coding values that should come from data.
Frequently asked questions
What does TLF stand for? Tables, listings and figures — the formatted results of a clinical trial.
What is a table shell? A mock-up of an output showing its layout, titles, columns and footnotes, created before programming starts.
Which SAS procedures are used for TLFs? Mainly PROC REPORT with ODS RTF or PDF for tables and listings, and PROC SGPLOT and PROC LIFETEST for figures.
Are TLFs built from SDTM or ADaM? From ADaM, which is designed to make analyses traceable back to SDTM.
Preparing for interviews? See Clinical SAS interview questions.
Learn TLF programming with Eduvercity
Eduvercity's live online Clinical SAS and Clinical R courses, taught by Neha Jain, include a hands-on TLF project with demographic, adverse event and laboratory outputs in SAS and R.
About the author
Neha Jain is a Principal Consultant and Trainer at Eduvercity and works independently as a freelance SAS consultant and trainer. She has trained professionals in SAS for more than 17 years and has more than 20 years of experience as a global consultant across programming, data and project leadership, and has trained more than 5,000 students and professionals, as well as teams at companies worldwide. She teaches Base and Advanced SAS, Clinical SAS (CDISC SDTM, ADaM and TLFs), clinical R and Python to learners in India, the UAE, the UK, the USA and Canada, and advises teams moving clinical programming work from SAS to R. The views in this article are her own. More about Neha and Eduvercity.




Comments