La dernière version de ‘flextable’ est sur CRAN depuis quelques jours.
Cette version apporte quelques améliorations majeures :
- Les retours chariot
\n
sont maintenant supportés avecautofit()
, - le rendu HTML du texte orienté verticalement est désormais correct et cohérent avec les alignements horizontaux,
- les tabulations
\t
et les retours chariot\n
sont désormais correctement gérés dans PowerPoint, - il est désormais possible de placer plusieurs fois une même référence dans une note de bas de page.
- le rendu PDF permet trois options de placement, fixe, flottant et enveloppant.
Il contient également quelques nouvelles fonctionnalités que nous sommes heureux de vous présenter dans ce post.
tabulator
Cette nouvelle fonction prépare des agrégations dans une structure
qui peut ensuite être transformée en flextable. L’objectif est de fournir
un outil permettant la création de tableaux de reporting où les dimensions
sont disposées en lignes et en colonnes et où une ou plusieurs statistiques
sont affichées dans le contenu des cellules. La grammaire ‘flextable’ peut
être utilisée pour personnaliser le tableau généré avec comamnd flextable::as_flextable()
.
La fonction va créer un tableau à partir d’agrégations déjà calculées.
Subset of original dataset | |||||||
cut | color | I1 | SI1 | VS2 | |||
Good | D | 3.5 (± 2.2) | 3.0 (± 2.8) | 3.6 (± 3.4) | |||
E | 4.4 (± 2.5) | 3.2 (± 3.1) | 3.8 (± 3.3) | ||||
F | 2.6 (± 1.9) | 3.3 (± 3.0) | 3.8 (± 3.2) | ||||
G | 3.2 (± 2.0) | 4.1 (± 3.9) | 4.1 (± 3.3) | ||||
H | 3.8 (± 2.2) | 4.2 (± 3.8) | 4.4 (± 4.2) | ||||
I | 4.2 (± 2.9) | 4.7 (± 4.5) | 6.0 (± 5.1) | ||||
J | 3.8 (± 2.1) | 4.6 (± 3.9) | 4.8 (± 3.6) | ||||
Very Good | D | 2.6 (± 0.8) | 3.2 (± 2.9) | 3.1 (± 3.3) | |||
E | 3.4 (± 2.2) | 3.2 (± 3.1) | 3.3 (± 3.5) | ||||
F | 4.3 (± 2.6) | 3.6 (± 3.2) | 4.0 (± 3.8) | ||||
G | 3.2 (± 2.1) | 3.5 (± 3.6) | 4.4 (± 4.0) | ||||
H | 5.3 (± 2.5) | 4.9 (± 4.4) | 4.6 (± 4.0) | ||||
I | 6.0 (± 4.9) | 5.2 (± 4.5) | 5.8 (± 5.1) | ||||
J | 4.5 (± 2.7) | 5.0 (± 4.1) | 5.3 (± 4.5) |
Dans un document Word, le résultat serait le suivant. Notez que le numéro de page est indiqué dans la ligne supérieure du tableau. Le code de cet exemple est disponible dans la galerie flextable ici.
tabulator()
bénéficie de tous les avantages de la grammaire
flextable et peut construire des tableaux complexes
composés de graphiques et de texte :
Subset of original dataset | ||||||||||
cut | color | I1 | SI1 | VS2 | ||||||
y stats | density | y stats | density | y stats | density | |||||
Good | D | 3.5 (± 2.2) | 3.0 (± 2.8) | 3.6 (± 3.4) | ||||||
E | 4.4 (± 2.5) | 3.2 (± 3.1) | 3.8 (± 3.3) | |||||||
F | 2.6 (± 1.9) | 3.3 (± 3.0) | 3.8 (± 3.2) | |||||||
G | 3.2 (± 2.0) | 4.1 (± 3.9) | 4.1 (± 3.3) | |||||||
H | 3.8 (± 2.2) | 4.2 (± 3.8) | 4.4 (± 4.2) | |||||||
I | 4.2 (± 2.9) | 4.7 (± 4.5) | 6.0 (± 5.1) | |||||||
J | 3.8 (± 2.1) | 4.6 (± 3.9) | 4.8 (± 3.6) | |||||||
Very Good | D | 2.6 (± 0.8) | 3.2 (± 2.9) | 3.1 (± 3.3) | ||||||
E | 3.4 (± 2.2) | 3.2 (± 3.1) | 3.3 (± 3.5) | |||||||
F | 4.3 (± 2.6) | 3.6 (± 3.2) | 4.0 (± 3.8) | |||||||
G | 3.2 (± 2.1) | 3.5 (± 3.6) | 4.4 (± 4.0) | |||||||
H | 5.3 (± 2.5) | 4.9 (± 4.4) | 4.6 (± 4.0) | |||||||
I | 6.0 (± 4.9) | 5.2 (± 4.5) | 5.8 (± 5.1) | |||||||
J | 4.5 (± 2.7) | 5.0 (± 4.1) | 5.3 (± 4.5) |
Summarizor pour les résumés de tableaux
La fonction summarizor()
est une fonction utilitaire qui prépare
un résumé numérique pour chaque variable d’un ensemble de données,
éventuellement par groupes. Elle est censée être utilisée pour produire
l’argument de tabulator()
.
variable | stat | nonchilled | chilled | Overall | ||||||
Est. | N | Est. | N | Est. | N | |||||
Type | Quebec | 21 (50.0 %) | 21 (50.0 %) | 42 (50.0 %) | ||||||
Mississippi | 21 (50.0 %) | 21 (50.0 %) | 42 (50.0 %) | |||||||
Missing | 0 (0.0 %) | 0 (0.0 %) | 0 (0.0 %) | |||||||
conc | Min. | 95.0 | 95.0 | 95.0 | ||||||
1st Qu. | 175.0 | 175.0 | 175.0 | |||||||
Mean | 435.0 | 435.0 | 435.0 | |||||||
Median | 350.0 | 350.0 | 350.0 | |||||||
3rd Qu. | 675.0 | 675.0 | 675.0 | |||||||
Max. | 1 000.0 | 1 000.0 | 1 000.0 | |||||||
Missing | 0 (0.0 %) | 0 (0.0 %) | 0 (0.0 %) | |||||||
uptake | Min. | 10.6 | 7.7 | 7.7 | ||||||
1st Qu. | 26.5 | 14.5 | 17.9 | |||||||
Mean | 30.6 | 23.8 | 27.2 | |||||||
Median | 31.3 | 19.7 | 28.3 | |||||||
3rd Qu. | 38.7 | 34.9 | 37.1 | |||||||
Max. | 45.5 | 42.4 | 45.5 | |||||||
Missing | 0 (0.0 %) | 0 (0.0 %) | 0 (0.0 %) |
Le code de cet exemple est disponible dans la galerie flextable ici.
Impression automatique des flextable
flextable fournit deux nouvelles fonctions dédiées au ‘R Markdown’ qui transforment automatiquement les data.frame et les modèles en flextable.
Les data.frames en flextables
Nous avons ajouté un code que nous utilisions pour nos formations et qui
permet d’afficher des data.frame comme des flextables dans des documents
‘R Markdown’. Nous avons essayé d’imiter la sortie de ‘data.table’ et
de ‘tibble’ en affichant seulement les premières lignes et le type des colonnes.
Pour tirer parti de cette fonctionnalité, nous devons appeler la fonction use_df_printer()
et voilà !
use_df_printer()
airquality
Ozone | Solar.R | Wind | Temp | Month | Day |
integer | integer | numeric | integer | integer | integer |
41 | 190 | 7.4 | 67 | 5 | 1 |
36 | 118 | 8.0 | 72 | 5 | 2 |
12 | 149 | 12.6 | 74 | 5 | 3 |
18 | 313 | 11.5 | 62 | 5 | 4 |
14.3 | 56 | 5 | 5 | ||
28 | 14.9 | 66 | 5 | 6 | |
23 | 299 | 8.6 | 65 | 5 | 7 |
19 | 99 | 13.8 | 59 | 5 | 8 |
8 | 19 | 20.1 | 61 | 5 | 9 |
194 | 8.6 | 69 | 5 | 10 | |
n: 153 |
Les modèles en flextables
Nous avons implémenté la déclaration des modèles dans flextable, la fonction
as_flextable()
fait la transformation. Pour le moment, les modèles
suivants sont supportés : gam, lm, glm,
glmmTMB, glmmadmb, htest, kmeans, pam, lme, gls, merMod,
nlme et brmsfit.
Voici un exemple réalisé à partir d’un modèle lme
:
library(nlme)
m1 <- lme(distance ~ age, data = Orthodont)
ft <- as_flextable(m1)
ft
group | Estimate | Standard Error | df | statistic | p-value | ||
Fixed effects | |||||||
(Intercept) | 16.761 | 0.775 | 80 | 21.620 | 0.0000 | *** | |
age | 0.660 | 0.071 | 80 | 9.265 | 0.0000 | *** | |
Random effects | |||||||
Subject | sd_(Intercept) | 2.327 | |||||
Subject | cor_age.(Intercept) | -0.609 | |||||
Subject | sd_age | 0.226 | |||||
Residual | sd_Observation | 1.310 | |||||
Signif. codes: 0 <= '***' < 0.001 < '**' < 0.01 < '*' < 0.05 | |||||||
square root of the estimated residual variance: 1.3 | |||||||
data's log-likelihood under the model: -221.3 | |||||||
Akaike Information Criterion: 454.6 | |||||||
Bayesian Information Criterion: 470.6 |
Dans un document ‘R Markdown’, il est possible d’automatiser l’impression des
modèles en flextable en utilisant la fonction use_model_printer()
.
Voici un exemple réalisé avec un clustering kmean :
use_model_printer()
kmeans(scale(mtcars[1:7]), 5)
variable | 1 | 2 | 3 | 4 | 5 | |||||
withinss | 14.5 | 12.8 | 0.6 | 1.5 | 23.9 | |||||
size | 10 | 7 | 2 | 2 | 11 | |||||
mpg* | -0.7949 | -0.0577 | -1.0437 | -0.7783 | 1.0906 | |||||
cyl* | 1.0149 | -0.1050 | 1.0149 | 1.0149 | -1.2249 | |||||
disp* | 1.0281 | -0.3825 | 1.0027 | 0.7688 | -1.0133 | |||||
hp* | 0.5442 | -0.3559 | 1.4339 | 2.2288 | -0.9342 | |||||
drat* | -1.0204 | -0.0203 | -0.2367 | 0.5301 | 0.8872 | |||||
wt* | 0.9879 | -0.1023 | 0.4985 | 0.1561 | -0.9520 | |||||
qsec* | -0.2254 | 0.0719 | -1.2444 | -1.8460 | 0.7211 | |||||
(*) Centers | ||||||||||
Total sum of squares: 217.0 | ||||||||||
Total within-cluster sum of squares: 53.3 | ||||||||||
Total between-cluster sum of squares: 163.7 | ||||||||||
BSS/TSS ratio: 75.4% | ||||||||||
Number of iterations: 2 |
Separation des entêtes
Vous pouvez maintenant séparer les noms de colonnes en plusieurs
lignes avec la fonction separate_header()
. Cela facilite la création de
rapports sur les agrégations calculées avec ‘dplyr’ ou ‘data.table’.
Dans l’exemple suivant, nous agrégeons la célèbre table ‘penguins’.
species | island | bill_length_avg | bill_length_sd | bill_depth_avg | bill_depth_sd | flipper_length_avg | flipper_length_sd |
factor | factor | numeric | numeric | numeric | numeric | numeric | numeric |
Adelie | Biscoe | 39.0 | 2.5 | 18.4 | 1.2 | 188.8 | 6.7 |
Adelie | Dream | 38.5 | 2.5 | 18.3 | 1.1 | 189.7 | 6.6 |
Adelie | Torgersen | 39.0 | 3.0 | 18.4 | 1.3 | 191.2 | 6.2 |
Chinstrap | Dream | 48.8 | 3.3 | 18.4 | 1.1 | 195.8 | 7.1 |
Gentoo | Biscoe | 47.5 | 3.1 | 15.0 | 1.0 | 217.2 | 6.5 |
Sans aucune manipulation intermédiaire, nous créons le “flextable” et
restructurons les étiquettes d’en-tête avec la fonction separate_header()
.
ft <- dat |>
flextable() |>
separate_header() |>
autofit()
ft
species | island | bill | flipper | ||||
length | depth | length | |||||
avg | sd | avg | sd | avg | sd | ||
Adelie | Biscoe | 38.97500 | 2.480916 | 18.37045 | 1.1888199 | 188.7955 | 6.729247 |
Adelie | Dream | 38.50179 | 2.465359 | 18.25179 | 1.1336171 | 189.7321 | 6.585083 |
Adelie | Torgersen | 38.95098 | 3.025318 | 18.42941 | 1.3394468 | 191.1961 | 6.232238 |
Chinstrap | Dream | 48.83382 | 3.339256 | 18.42059 | 1.1353951 | 195.8235 | 7.131894 |
Gentoo | Biscoe | 47.50488 | 3.081857 | 14.98211 | 0.9812198 | 217.1870 | 6.484976 |
Il est ensuite assez facile de le personnaliser et de produire un tableau comme ci-dessous :
species | island | bill | flipper | ||||
length | depth | length | |||||
avg1 | sd2 | avg1 | sd2 | avg1 | sd2 | ||
Adelie | Biscoe | 38.98 | 2.48 | 18.37 | 1.19 | 188.80 | 6.73 |
Dream | 38.50 | 2.47 | 18.25 | 1.13 | 189.73 | 6.59 | |
Torgersen | 38.95 | 3.03 | 18.43 | 1.34 | 191.20 | 6.23 | |
Chinstrap | Dream | 48.83 | 3.34 | 18.42 | 1.14 | 195.82 | 7.13 |
Gentoo | Biscoe | 47.50 | 3.08 | 14.98 | 0.98 | 217.19 | 6.48 |
1Arithmetic Mean | |||||||
2Standard Deviation |
Le code de cet exemple est disponible dans la galerie flextable ici.
GitHub Discussions
Faites-nous part de vos problèmes, de vos questions et de vos commentaires dans les “Discussions GitHub”, désormais disponibles sur la page Github de flextable’ : https://github.com/davidgohel/flextable/discussions.
Suivez nous: - Sites recommandés: R-bloggers R weekly Twitter #rstats Jobs for R-users