
Le tableau démographique rtables : créer la Table 1 en R de deux façons
Construisez le tableau démographique et des caractéristiques initiales (la Table 14-1.01 du CSR) en R — la façon rapide avec gtsummary::tbl_summary() et la façon qualité soumission avec rtables et tern — sur des données pharmaverse publiques
Un tutoriel complet et exécutable pour le tableau démographique clinique (Table 1, la Table 14-1.01 du CSR). Découvrez ce qu’est un tableau démographique (lignes = caractéristiques initiales telles que l’âge, le groupe d’âge, le sexe et la race ; colonnes = bras de traitement plus un Total ; n/moyenne (SD)/médiane/min-max pour les variables continues et n (%) pour les catégorielles), puis construisez-le de deux façons sur des données ADSL pharmaverseadam publiques : rapidement avec gtsummary::tbl_summary() (add_overall(), étiqueté), et en qualité soumission avec le moteur de mise en page rtables/tern (basic_table() |> split_cols_by() |> analyze_vars() |> build_table()) utilisé dans le travail réglementaire.
- Le tableau démographique, c’est la Table 1 — le résumé démographique et des caractéristiques initiales qui ouvre chaque Clinical Study Report (souvent numéroté Table 14-1.01). Les lignes sont les caractéristiques initiales (âge, groupe d’âge, sexe, race) ; les colonnes sont les bras de traitement plus un Total.
- Deux moteurs, deux usages.
gtsummary::tbl_summary()construit un tableau soigné en un seul appel — idéal pour une exploration HTML rapide.rtables+ternconstruisent le même tableau à partir d’une mise en page explicite — le moteur validé, exportable en RTF, que la pharma utilise pour les sorties de soumission. - Continu vs catégoriel, par convention. Les variables continues (âge) rapportent n, moyenne (SD), médiane, min–max ; les variables catégorielles (sexe, race) rapportent n (%) dans chaque colonne.
- La population compte. Un tableau démographique résume une population d’analyse — ici la population de sécurité (
SAFFL == "Y"), qui écarte les échecs de sélection, de sorte que les effectifs de colonne correspondent à tous les autres tableaux de sécurité. - Mêmes chiffres, format différent. Les deux moteurs lisent le même ADSL et produisent les mêmes statistiques ; gtsummary rend un tableau HTML,
ternrend la sortie monospace, paginable en RTF, qu’attend un évaluateur.
Introduction
Chaque Clinical Study Report s’ouvre de la même façon : un tableau de qui faisait partie de l’essai. C’est le tableau démographique et des caractéristiques initiales — la « Table 1 » dans un article, la Table 14-1.01 dans une soumission — et il répond à la première question que pose tout évaluateur : les bras de traitement étaient-ils comparables à l’inclusion ? L’âge, le sexe, la race et les principales mesures initiales sont résumés en lignes et répartis par bras de traitement en colonnes, avec une colonne Total à la fin.
C’est le premier tableau du workflow pharma TLF (tables, listings et figures), et R vous donne deux façons de le construire. La façon rapide, c’est gtsummary : un seul appel à tbl_summary() et vous obtenez un tableau HTML étiqueté, prêt à publier. La façon qualité soumission, c’est rtables avec son compagnon clinique tern — le moteur de mise en page que l’industrie pharmaceutique utilise pour produire des sorties validées, prêtes pour le RTF. Cette leçon construit le même tableau des deux façons, sur des données pharmaverse publiques, de sorte que chaque ligne s’exécute telle quelle.
Voici la question à laquelle le tableau répond, dessinée comme une image — la distribution de l’âge par bras, calculée à partir de l’ADSL que nous résumons ci-dessous :
Les trois courbes se superposent presque parfaitement — les bras sont équilibrés sur l’âge, ce qui est exactement la réassurance que le tableau démographique existe pour apporter. À la fin de cette leçon, vous aurez produit ce résumé sous forme de tableau formel, deux fois. Si « ADSL », « ADaM » ou « bras de traitement » vous sont nouveaux, commencez par Créer l’ADSL en R avec admiral, qui construit le jeu de données au niveau sujet que ce tableau lit.
Ce qu’est un tableau démographique
Un tableau démographique est un tableau de synthèse : une population d’analyse, résumée par bras de traitement. Sa forme est fixée par une convention de longue date — la ligne directrice ICH E3 sur les Clinical Study Reports définit la section 14.1, Données démographiques, et la numérotation industrielle Table 14-1.01 en découle — de sorte que chacun que vous construirez aura la même anatomie :
| Partie | Ce que c’est | Dans cette leçon |
|---|---|---|
| Lignes | Les caractéristiques initiales résumées | Âge, groupe d’âge, sexe, race |
| Colonnes | Les bras de traitement, plus un Total | Placebo · Xanomeline Low · Xanomeline High · All Patients |
| Stats continues | Statistiques descriptives par bras | n, moyenne (SD), médiane, min–max |
| Stats catégorielles | Effectifs au sein de chaque bras | n (%) par catégorie |
| En-tête de colonne (N=) | La taille de population de chaque bras | Le « grand N » — le dénominateur de chaque pourcentage |
Deux conventions déterminent si un tableau est juste :
- Les variables continues reçoivent des statistiques de distribution, les variables catégorielles des effectifs. L’âge est continu, il rapporte donc une moyenne et une dispersion ; le sexe et la race sont catégoriels, ils rapportent donc des effectifs et des pourcentages. Confondre les deux (une « moyenne » pour le sexe) est l’erreur classique du débutant — les deux moteurs ci-dessous choisissent le bon résumé à partir du type de la variable, ce qui est exactement la raison pour laquelle vous les utilisez au lieu de bricoler à la main avec
aggregate(). - Le dénominateur du pourcentage est le N de la colonne, pas le total général. Un 90 % pour « WHITE » dans la colonne Placebo signifie 90 % du bras Placebo, pas 90 % de tout le monde. Bien faire cela, c’est ce qui fait que les colonnes s’additionnent correctement.
Les données
Nous utilisons l’ADSL (Subject-Level Analysis Dataset) livré dans pharmaverseadam — une ligne par sujet issue de l’étude pilote CDISC synthétique, portant déjà le bras de traitement, les données démographiques et les indicateurs de population dont un tableau démographique a besoin. Nous résumons la population de sécurité (SAFFL == "Y"), la population standard pour un tableau initial : elle écarte les 52 sujets en échec de sélection qui n’ont jamais reçu de dose, laissant les trois véritables bras de traitement.
library(dplyr, warn.conflicts = FALSE)
library(pharmaverseadam)
adsl <- pharmaverseadam::adsl %>%
filter(SAFFL == "Y") %>%
mutate(
# Order the arms the way the table should read (placebo first), and make the
# categorical variables factors so their levels display in a controlled order.
TRT01P = factor(TRT01P,
levels = c("Placebo", "Xanomeline Low Dose", "Xanomeline High Dose")),
AGEGR1 = factor(AGEGR1, levels = c("18-64", ">64")),
SEX = factor(SEX, levels = c("F", "M")),
RACE = factor(RACE)
)
adsl %>%
select(USUBJID, TRT01P, AGE, AGEGR1, SEX, RACE) %>%
head(5)# A tibble: 5 × 6
USUBJID TRT01P AGE AGEGR1 SEX RACE
<chr> <fct> <dbl> <fct> <fct> <fct>
1 01-701-1015 Placebo 63 18-64 F WHITE
2 01-701-1023 Placebo 64 18-64 M WHITE
3 01-701-1028 Xanomeline High Dose 71 >64 M WHITE
4 01-701-1033 Xanomeline Low Dose 74 >64 M WHITE
5 01-701-1034 Xanomeline High Dose 77 >64 F WHITE
L’ordre des bras en facteurs a son importance : il fixe l’ordre des colonnes du tableau (placebo d’abord, puis dose croissante), au lieu de le laisser tomber dans l’ordre alphabétique. Les quatre caractéristiques que nous allons résumer sont AGE (continue), AGEGR1 (tranche d’âge), SEX et RACE (toutes catégorielles).
Le construire rapidement avec gtsummary
gtsummary::tbl_summary() transforme un data frame en un tableau de synthèse prêt à publier en un seul appel. Vous lui passez les variables, vous lui dites de répartir by le bras de traitement, et il choisit un résumé sensé pour chaque type de variable automatiquement. Trois ajouts le rendent conforme à la soumission : add_overall() ajoute la colonne Total, label donne à chaque ligne un nom lisible, et statistic fixe les résumés exacts que la convention demande.
library(gtsummary)
adsl %>%
select(TRT01P, AGE, AGEGR1, SEX, RACE) %>%
tbl_summary(
by = TRT01P, # one column per treatment arm
label = list( # readable row labels
AGE ~ "Age (years)",
AGEGR1 ~ "Age group",
SEX ~ "Sex",
RACE ~ "Race"
),
statistic = list(
all_continuous() ~ "{mean} ({sd})", # continuous: mean (SD)
all_categorical() ~ "{n} ({p}%)" # categorical: n (percent)
),
digits = all_continuous() ~ 1
) %>%
add_overall(last = TRUE) %>% # the Total column, on the right
modify_header(label ~ "**Characteristic**") %>%
bold_labels()| Characteristic | Placebo N = 861 |
Xanomeline Low Dose N = 841 |
Xanomeline High Dose N = 841 |
Overall N = 2541 |
|---|---|---|---|---|
| Age (years) | 75.2 (8.6) | 75.7 (8.3) | 74.4 (7.9) | 75.1 (8.2) |
| Age group | ||||
| 18-64 | 14 (16%) | 8 (9.5%) | 11 (13%) | 33 (13%) |
| >64 | 72 (84%) | 76 (90%) | 73 (87%) | 221 (87%) |
| Sex | ||||
| F | 53 (62%) | 50 (60%) | 40 (48%) | 143 (56%) |
| M | 33 (38%) | 34 (40%) | 44 (52%) | 111 (44%) |
| Race | ||||
| AMERICAN INDIAN OR ALASKA NATIVE | 0 (0%) | 0 (0%) | 1 (1.2%) | 1 (0.4%) |
| BLACK OR AFRICAN AMERICAN | 8 (9.3%) | 6 (7.1%) | 9 (11%) | 23 (9.1%) |
| WHITE | 78 (91%) | 78 (93%) | 74 (88%) | 230 (91%) |
| 1 Mean (SD); n (%) | ||||
Lisez la sortie comme le fait un évaluateur. La ligne d’en-tête porte le N de chaque bras — N = 86 pour Placebo — et chaque pourcentage en dessous est rapporté à ce N. Age (years) rapporte 75.2 (8.6) : une moyenne de 75.2 ans avec un écart-type de 8.6 dans le bras Placebo. Sex et Race rapportent des effectifs et des pourcentages de colonne, donc les 53 (62 %) femmes du Placebo signifient 62 % des 86 sujets Placebo. La colonne Total à droite regroupe les 254 sujets. C’est un tableau démographique complet et correct — construit en un seul appel de fonction, rendu directement en HTML.
tbl_summary() est le bon outil quand vous voulez un tableau rapide et beau pour un rapport, un document Quarto ou de l’exploration. Ce pour quoi il n’est pas conçu, c’est la sortie validée, paginée, RTF qu’exige une soumission réglementaire — et c’est là qu’interviennent rtables et tern.
Le construire en qualité soumission avec rtables et tern
Dans le travail réglementé, le tableau est construit à partir d’une mise en page explicite — une description de la structure du tableau, antérieure aux données — qui est ensuite appliquée aux données. Cette séparation est ce qui rend la sortie auditable et réutilisable : la même mise en page peut être réexécutée sur n’importe quel jeu de données, paginée et exportée en RTF. rtables fournit le moteur de mise en page ; tern ajoute par-dessus les fonctions d’analyse cliniques. Le tableau démographique, c’est l’ analyze_vars() de tern déposé dans une mise en page rtables.
Vous lisez la mise en page de haut en bas comme une recette : démarrez un tableau, répartissez les colonnes par bras de traitement, ajoutez la colonne Total et les effectifs de colonne, puis analysez les variables choisies. Rien n’est calculé tant que build_table() n’applique pas la mise en page aux données.
library(rtables)
library(tern)
# 1. Describe the table layout (pre-data — no numbers yet)
lyt <- basic_table(
title = "Table 14-1.01",
subtitles = "Demographic and Baseline Characteristics (Safety Population)"
) %>%
split_cols_by("TRT01P") %>% # one column per arm
add_overall_col("All Patients") %>% # the Total column
add_colcounts() %>% # the (N=xx) header row
analyze_vars(
vars = c("AGE", "AGEGR1", "SEX", "RACE"),
var_labels = c("Age (years)", "Age group", "Sex", "Race"),
.stats = c("n", "mean_sd", "median", "range", "count_fraction"),
.formats = c(mean_sd = "xx.x (xx.x)", median = "xx.x", range = "xx.x - xx.x")
)
# 2. Apply the layout to the data to produce the table
build_table(lyt, df = adsl)Table 14-1.01
Demographic and Baseline Characteristics (Safety Population)
————————————————————————————————————————————————————————————————————————————————————————————————————————————
Placebo Xanomeline Low Dose Xanomeline High Dose All Patients
(N=86) (N=84) (N=84) (N=254)
————————————————————————————————————————————————————————————————————————————————————————————————————————————
Age (years)
n 86 84 84 254
Mean (SD) 75.2 (8.6) 75.7 (8.3) 74.4 (7.9) 75.1 (8.2)
Median 76.0 77.5 76.0 77.0
Min - Max 52.0 - 89.0 51.0 - 88.0 56.0 - 88.0 51.0 - 89.0
Age group
n 86 84 84 254
18-64 14 (16.3%) 8 (9.5%) 11 (13.1%) 33 (13%)
>64 72 (83.7%) 76 (90.5%) 73 (86.9%) 221 (87%)
Sex
n 86 84 84 254
F 53 (61.6%) 50 (59.5%) 40 (47.6%) 143 (56.3%)
M 33 (38.4%) 34 (40.5%) 44 (52.4%) 111 (43.7%)
Race
n 86 84 84 254
AMERICAN INDIAN OR ALASKA NATIVE 0 0 1 (1.2%) 1 (0.4%)
BLACK OR AFRICAN AMERICAN 8 (9.3%) 6 (7.1%) 9 (10.7%) 23 (9.1%)
WHITE 78 (90.7%) 78 (92.9%) 74 (88.1%) 230 (90.6%)
La sortie est délibérément simple — largeur fixe, monospace, prête pour les notes de bas de page et la pagination — parce que c’est ce qu’est un tableau de soumission. Parcourez-le : sous Age (years) vous obtenez n, Mean (SD), Median et Min - Max par bras ; sous Sex et Race, n et le count (fraction%) pour chaque catégorie. Comparez les chiffres au tableau gtsummary ci-dessus — âge Placebo 75.2 (8.6), 53 (61.6 %) femmes — ils sont identiques, parce que les deux moteurs résument le même ADSL. Ce qui diffère, c’est la machinerie : tern a produit une mise en page que vous pouvez valider, réutiliser sur le prochain jeu de données, paginer, et confier à l’exportateur RTF de rtables pour le dossier de soumission.
La puissance de la mise en page se révèle quand vous la réutilisez. Parce que lyt est une description, pas un résultat, le même tableau démographique pour n’importe quel sous-groupe n’est qu’un build_table() de plus — sans nouvelle spécification :
# The same layout, applied to the female subjects only
build_table(lyt, df = adsl %>% filter(SEX == "F"))Table 14-1.01
Demographic and Baseline Characteristics (Safety Population)
————————————————————————————————————————————————————————————————————————————————————————————————————————————
Placebo Xanomeline Low Dose Xanomeline High Dose All Patients
(N=53) (N=50) (N=40) (N=143)
————————————————————————————————————————————————————————————————————————————————————————————————————————————
Age (years)
n 53 50 40 143
Mean (SD) 76.4 (8.7) 75.7 (8.1) 74.7 (7.7) 75.7 (8.2)
Median 78.0 77.5 76.0 77.0
Min - Max 59.0 - 89.0 54.0 - 87.0 56.0 - 88.0 54.0 - 89.0
Age group
n 53 50 40 143
18-64 9 (17%) 5 (10%) 5 (12.5%) 19 (13.3%)
>64 44 (83%) 45 (90%) 35 (87.5%) 124 (86.7%)
Sex
n 53 50 40 143
F 53 (100%) 50 (100%) 40 (100%) 143 (100%)
M 0 0 0 0
Race
n 53 50 40 143
AMERICAN INDIAN OR ALASKA NATIVE 0 0 0 0
BLACK OR AFRICAN AMERICAN 5 (9.4%) 6 (12%) 6 (15%) 17 (11.9%)
WHITE 48 (90.6%) 44 (88%) 34 (85%) 126 (88.1%)
Quel moteur, quand
Les deux moteurs sont corrects ; ils servent à différents moments du workflow. Utilisez ceci comme repère de décision :
| gtsummary | rtables + tern | |
|---|---|---|
| Idéal pour | Exploration rapide, rapports Quarto/HTML, manuscrits | Sorties de soumission réglementaire |
| Modèle mental | Un appel fait tout | Construire une mise en page réutilisable, puis l’appliquer |
| Sortie | HTML / gt / flextable soignés | Monospace, paginée, prête pour le RTF |
| Réutilisation sur un nouveau jeu de données | Rappeler la fonction | Réexécuter le même objet de mise en page |
| Rôle dans l’industrie | Largement utilisé en milieu académique + analyse précoce | Le standard pharma pour les TLF validées |
En pratique, beaucoup d’équipes utilisent les deux : gtsummary pour explorer et esquisser un tableau rapidement, puis rtables/tern pour la version qui entre dans la soumission validée. Ils sont complémentaires, pas concurrents.
Demandez à Prova « comment ajouter une colonne de p-value comparant les bras de traitement à mon tableau démographique gtsummary ? » — elle répond en s’appuyant sur les leçons de ce pilier, avec du code exécutable que vous pouvez essayer sur les données pharmaverse d’exemple. The runtime is the judge. Demander à Prova →
Problèmes fréquents
Chaque pourcentage est calculé sur le mauvais total. Si vos pourcentages catégoriels semblent trop petits, vous résumez presque certainement l’ensemble du jeu de données au lieu de répartir par bras. Dans gtsummary, l’argument by = TRT01P est ce qui rend les pourcentages par colonne ; dans tern, split_cols_by("TRT01P") le fait. Sans la répartition, vous obtenez une seule colonne et des pourcentages rapportés au total général.
Les échecs de sélection gonflent les effectifs. pharmaverseadam::adsl conserve les 52 sujets en échec de sélection (bras "Screen Failure"), qui ont été écartés à la randomisation et n’ont jamais reçu de dose. Un tableau démographique résume une population d’analyse, alors filtrez-la d’abord — filter(SAFFL == "Y") pour la population de sécurité. Sautez le filtre et vous obtenez une quatrième colonne « Screen Failure » erronée et de mauvais totaux par bras.
Une variable catégorielle est résumée comme continue (ou vice versa). Les deux moteurs choisissent le résumé à partir du type de la colonne. Un caractère ou un facteur est traité comme catégoriel (effectifs) ; un numérique est traité comme continu (moyenne/médiane). Si AGEGR1 est arrivé sous la forme de la chaîne sous laquelle il est stocké, c’est très bien — mais une variable codée numériquement (p. ex. un indicateur 0/1 stocké comme nombre) sera résumée par une moyenne tant que vous n’en faites pas un facteur d’abord. Dans le doute, passez factor() aux variables catégorielles avant de résumer, comme nous l’avons fait avec SEX et AGEGR1.
Questions fréquentes
C’est le tableau démographique et des caractéristiques initiales qui résume la population de l’essai par bras de traitement — généralement l’âge, le sexe, la race et les principales mesures initiales en lignes, avec une colonne par bras plus un Total. Dans un Clinical Study Report, il est habituellement numéroté Table 14-1.01 (la convention de numérotation de la ligne directrice ICH E3) ; dans un article, c’est la « Table 1 ». Son rôle est de montrer si les bras étaient comparables à l’inclusion.
Deux façons courantes. La façon rapide, c’est gtsummary::tbl_summary() : tbl_summary(by = TRT01P) plus add_overall() donne un tableau HTML étiqueté en un seul appel. La façon qualité soumission, c’est rtables + tern : construisez une mise en page avec basic_table() |> split_cols_by("TRT01P") |> analyze_vars(...) et appliquez-la avec build_table(). Les deux sont détaillées ci-dessus sur des données pharmaverse publiques.
gtsummary est un package de tableaux de synthèse polyvalent en un seul appel qui rend du HTML soigné — idéal pour l’exploration, les manuscrits et les rapports. rtables/tern est le moteur de mise en page pharma : vous décrivez une mise en page réutilisable qui est appliquée aux données, produisant la sortie monospace, paginée, exportable en RTF qu’exige une soumission réglementaire. Utilisez gtsummary pour aller vite ; utilisez rtables/tern pour les TLF de soumission validées. Beaucoup d’équipes utilisent les deux.
Par convention, les variables continues (comme l’âge) rapportent n, moyenne (SD), médiane et min–max, et les variables catégorielles (comme le sexe et la race) rapportent n (%) — où le dénominateur du pourcentage est la taille de population de la colonne (le « grand N » dans l’en-tête), pas le total général. Les deux moteurs de cette leçon choisissent le bon résumé à partir du type de chaque variable automatiquement.
Parce que l’ADSL contient encore des sujets en échec de sélection. Un tableau démographique résume une seule population d’analyse, alors filtrez-la avant de résumer — filter(SAFFL == "Y") pour la population de sécurité écarte les 52 échecs de sélection n’ayant jamais reçu de dose et laisse les trois véritables bras de traitement avec les effectifs de colonne corrects.
Oui — c’est la raison de l’utiliser. Les sorties de rtables sont conçues pour paginer et s’exporter en RTF (et TXT) pour le dossier de soumission via ses exportateurs. Parce que le tableau est construit à partir d’un objet de mise en page réutilisable, la même mise en page peut être réappliquée à un nouveau jeu de données ou à un sous-groupe et réexportée, ce qui est ce qui le rend auditable et compatible avec la validation. (L’étape d’export et de pagination est couverte dans la profondeur Pro de cette série.)
Testez vos connaissances
À l’aide de l’objet adsl construit dans cette leçon, ajoutez une caractéristique de région géographique au tableau démographique gtsummary. Dérivez un facteur REGION qui vaut "North America" lorsque COUNTRY est "USA" ou "CAN" et "Rest of World" sinon, étiquetez-le "Region", et incluez-le comme une nouvelle ligne répartie par bras de traitement avec une colonne Total.
Créez la nouvelle colonne avec mutate() + if_else() sur COUNTRY, enveloppez-la dans factor() pour qu’elle soit traitée comme catégorielle, puis ajoutez REGION au select() et à la liste label de tbl_summary(). Les pourcentages seront par colonne automatiquement grâce à by = TRT01P.
library(dplyr)
library(gtsummary)
adsl %>%
mutate(REGION = factor(if_else(COUNTRY %in% c("USA", "CAN"),
"North America", "Rest of World"))) %>%
select(TRT01P, AGE, SEX, REGION) %>%
tbl_summary(
by = TRT01P,
label = list(AGE ~ "Age (years)", SEX ~ "Sex", REGION ~ "Region"),
statistic = list(all_continuous() ~ "{mean} ({sd})",
all_categorical() ~ "{n} ({p}%)"),
digits = all_continuous() ~ 1
) %>%
add_overall(last = TRUE) %>%
modify_header(label ~ "**Characteristic**")REGION apparaît comme un nouveau bloc catégoriel avec n (%) par bras. Dans le pilote CDISC, chaque sujet est aux États-Unis, donc le tableau montre une seule ligne « North America » à 100 % dans chaque bras — un rappel qu’il faut toujours vérifier qu’un regroupement dérivé varie réellement avant d’en tirer la moindre conclusion.
A. Le total général de tous les sujets de l’essai B. Le nombre de sujets dans le bras de traitement de cette colonne (le N de la colonne) C. Le nombre de sujets ayant une valeur non manquante pour cette variable
B. Chaque n (%) catégoriel est calculé au sein de sa colonne — le dénominateur du pourcentage est la taille de population du bras, affichée comme le N = dans l’en-tête de colonne. C’est pourquoi les effectifs d’une colonne s’additionnent jusqu’au N de cette colonne, et pourquoi la répartition par bras de traitement (by = TRT01P / split_cols_by("TRT01P")) est ce qui rend les pourcentages significatifs. (C décrit la manière dont les valeurs manquantes sont traitées, un réglage distinct ; A est l’erreur que vous obtenez si vous oubliez de répartir par bras.)
Conclusion
Le tableau démographique est la première sortie du workflow TLF et la plus simple à raisonner : une population d’analyse, résumée par bras de traitement, avec la bonne statistique pour chaque type de variable. R vous offre deux moteurs pour cela. gtsummary::tbl_summary() le construit en un seul appel et rend du HTML soigné — parfait pour l’exploration et les rapports. rtables + tern le construisent à partir d’une mise en page explicite et réutilisable (basic_table() |> split_cols_by() |> analyze_vars() |> build_table()) qui valide, pagine et exporte en RTF — le moteur dont une soumission a besoin. Ils produisent les mêmes chiffres ; ils servent des fins différentes. Réussissez la population et la répartition des colonnes, et chaque effectif de votre Table 14-1.01 est juste.
Cette leçon est reproductible : chaque résultat de cette page a été produit par le code montré — copiez n’importe quel bloc et exécutez-le pour les reproduire. The runtime is the judge.
Leçons connexes
- Créer l’ADSL en R avec admiral — construit le jeu de données au niveau sujet, les bras de traitement et les indicateurs de population que ce tableau démographique lit. · Construire le jeu de données ADaM de temps jusqu’à événement (ADTTE) — le jeu de données d’efficacité derrière la figure de Kaplan-Meier, la sortie suivante de la série TLF. · Créer l’ADAE en R avec admiral — le jeu de données d’événements indésirables derrière les tableaux de synthèse des EI qui suivent le tableau démographique.
- Où cela s’inscrit : construire l’ADaM avec admiral (ADSL, ADAE, ADTTE) → générer les tables, listings et figures (vous êtes ici : le tableau démographique → tableaux d’EI → la figure de Kaplan-Meier) → empaqueter la soumission. Le tableau démographique est le premier et le plus simple TLF de cette séquence.
Réutilisation
Citation
@online{2026,
author = {},
title = {Le tableau démographique rtables : créer la Table 1 en R de
deux façons},
date = {2026-06-30},
url = {https://www.datanovia.com/learn/pharma-clinical/04-tlf-generation/demographic-table-rtables},
langid = {fr}
}