Ta-belle

Keywords: #R #collapse #gt #fastverse #tidyverse

Sto iniziando a studiare due pacchetti di R che mi sembrano interessanti

Il primo promette di

  1. To facilitate complex data transformation, exploration and computing tasks in R.
  2. To help make R code fast, flexible, parsimonious and programmer friendly.

Il secondo dovrebbe essere uno strumento più moderno e flessibile per generare tavole (o tabelle)

With the gt package, anyone can make wonderful-looking tables using the R programming language. The gt philosophy: we can construct a wide variety of useful tables with a cohesive set of table parts. These include the table header, the stub, the column labels and spanner column labels, the table body, and the table footer.

Per puro gioco potrei riscrivere le righe precedenti così Table 1.

pacchettoscopo

collapse

  1. To facilitate complex data transformation, exploration and computing tasks in R.

  2. To help make R code fast, flexible, parsimonious and programmer friendly.

gt

With the gt package, anyone can make wonderful-looking tables using the R programming language. The gt philosophy: we can construct a wide variety of useful tables with a cohesive set of table parts. These include the table header, the stub, the column labels and spanner column labels, the table body, and the table footer.

Table 1: Pacchetti

Da notare che i pacchetti appartengono, per così dire, a due universi paralleli: fastverse e tidyverse, ma interagiscono benissimo.

Ora un esempio più corposo usando come dataset penguins contenuto nel pacchetto palmerpenguins. I dati riguardano tre specie diverse di pinguini e sono stati raccolti nella Palmer Station da Kristen Gorman.1 Table 2

Artwork by @allison_horst
Code
su <- collapse::qsu(penguins, by = ~ species + island, cols = 3:6)
sa <- base::aperm(su, c(3L, 2L, 1L))
sa <- as.data.frame(sa)
collapse::setrename(sa, Variable = "Species+Island", Group = Measures)

Il codice crea un qsu (quick summary) del dataset, già eseguendo anche un raggruppamento per specie e isola di origine. Con il comando aperm si permuta il risultato di qsu in modo tale da rendere più semplice la creazione della tabella finale. Con setrename si modificano i nomi di default delle colonne.

A questo punto si può programmare la tabella nella quale verranno esposti i dati.

Code
pi <- sa |> gt() |>
  tab_header(title = md("**I pinguini delle Palmer**"),
             subtitle = "Specie, habitat e caratteri fisici") |>
          tab_row_group(
                        label = "Adelie",
                        rows = 1:12) |>
          tab_row_group(
                        label = "Chinstrap",
                        rows = 13:16) |>
          tab_row_group(
                        label = "Gentoo",
                        rows = 17:20) |>
tab_style(
          style = cell_fill(color = "lightyellow"),
          locations = cells_row_groups(groups = 1)
          ) |>
tab_style(
          style = cell_fill(color = "lightgreen"),
          locations = cells_row_groups(groups = 2)
          )  |>
tab_style(
          style = cell_fill(color = "lightblue"),
          locations = cells_row_groups(groups = 3)
) |>
data_color(
           columns = c(1),
           palette = "viridis"
             )
pi |> tab_options(quarto.disable_processing = TRUE)

I pinguini delle Palmer
Specie, habitat e caratteri fisici
Species+IslandMeasuresNMeanSDMinMax
Gentoo
Gentoo.Biscoebill_length_mm12347.504883.081857440.959.6
Gentoo.Biscoebill_depth_mm12314.982110.981219813.117.3
Gentoo.Biscoeflipper_length_mm123217.186996.4849758203.0231.0
Gentoo.Biscoebody_mass_g1235076.01626504.11623673950.06300.0
Chinstrap
Chinstrap.Dreambill_length_mm6848.833823.339255940.958.0
Chinstrap.Dreambill_depth_mm6818.420591.135395116.420.8
Chinstrap.Dreamflipper_length_mm68195.823537.1318943178.0212.0
Chinstrap.Dreambody_mass_g683733.08824384.33508142700.04800.0
Adelie
Adelie.Biscoebill_length_mm4438.975002.480915534.545.6
Adelie.Biscoebill_depth_mm4418.370451.188819916.021.1
Adelie.Biscoeflipper_length_mm44188.795456.7292473172.0203.0
Adelie.Biscoebody_mass_g443709.65909487.73372182850.04775.0
Adelie.Dreambill_length_mm5638.501792.465359432.144.1
Adelie.Dreambill_depth_mm5618.251791.133617115.521.2
Adelie.Dreamflipper_length_mm56189.732146.5850825178.0208.0
Adelie.Dreambody_mass_g563688.39286455.14643712900.04650.0
Adelie.Torgersenbill_length_mm5138.950983.025318033.546.0
Adelie.Torgersenbill_depth_mm5118.429411.339446815.921.5
Adelie.Torgersenflipper_length_mm51191.196086.2322375176.0210.0
Adelie.Torgersenbody_mass_g513706.37255445.10794022900.04700.0

Table 2: Occhiata rapida

Come inizio non c’è male, magari ho esagerato con i colori, ma li ho usati solo per capire la sintassi. Il concetto è molto simile a quello di ggplot2 in cui si aggiungono strati su strati, d’altronde sempre dalla stessa fucina escono.

Con collapse potremmo anche vedere i dati sotto un altro aspetto, ponendo, per esempio, l’accento sulle caratteristiche fisiche. Table 3

Code
i <- collapse::qsu(penguins, by = ~ island + species, cols= 3:6, array = FALSE)
qw <- unlist2d(i, idcols = c("Variable"), row.names = "Island & Species") |>
  gt() |>
    tab_header(title = md("**I pinguini delle Palmer**"),
             subtitle = "Misure dei caratteri fisici") |>
          data_color(
                     columns = c(1),
                     palette = "viridis"
)
qw |> tab_options(quarto.disable_processing = TRUE)

I pinguini delle Palmer
Misure dei caratteri fisici
VariableIsland & SpeciesNMeanSDMinMax
bill_length_mmBiscoe.Adelie4438.975002.480915534.545.6
bill_length_mmBiscoe.Gentoo12347.504883.081857440.959.6
bill_length_mmDream.Adelie5638.501792.465359432.144.1
bill_length_mmDream.Chinstrap6848.833823.339255940.958.0
bill_length_mmTorgersen.Adelie5138.950983.025318033.546.0
bill_depth_mmBiscoe.Adelie4418.370451.188819916.021.1
bill_depth_mmBiscoe.Gentoo12314.982110.981219813.117.3
bill_depth_mmDream.Adelie5618.251791.133617115.521.2
bill_depth_mmDream.Chinstrap6818.420591.135395116.420.8
bill_depth_mmTorgersen.Adelie5118.429411.339446815.921.5
flipper_length_mmBiscoe.Adelie44188.795456.7292473172.0203.0
flipper_length_mmBiscoe.Gentoo123217.186996.4849758203.0231.0
flipper_length_mmDream.Adelie56189.732146.5850825178.0208.0
flipper_length_mmDream.Chinstrap68195.823537.1318943178.0212.0
flipper_length_mmTorgersen.Adelie51191.196086.2322375176.0210.0
body_mass_gBiscoe.Adelie443709.65909487.73372182850.04775.0
body_mass_gBiscoe.Gentoo1235076.01626504.11623673950.06300.0
body_mass_gDream.Adelie563688.39286455.14643712900.04650.0
body_mass_gDream.Chinstrap683733.08824384.33508142700.04800.0
body_mass_gTorgersen.Adelie513706.37255445.10794022900.04700.0

Table 3: Caratteristiche fisiche

Ancora un esempio Table 4.

Code
s <- collapse::qsu(penguins, pid = ~ species, cols = c(3:6), higher = TRUE)
s <- base::aperm(s, c(3L, 2L, 1L))
s <- as.data.frame(s)
collapse::setrename(s, Group = "Caratteri misurati")
dsa <- s |> gt() |>
    tab_header(title = md("**I pinguini delle Palmer**"),
  subtitle = "Caratteri misurati") |>
          data_color(
                     columns = c(1),
                     palette = "viridis"
) |>
tab_footnote(footnote = "Overall è riferito a tutte le osservazioni",
             locations = cells_body(
                                    columns = Trans,
                                    rows = 1
             )
             ) |>
tab_footnote(footnote = "Between-species (i.e. species averaged)",
             locations = cells_body(
                                    columns = Trans,
                                    rows = 2
             )
             ) |>
tab_footnote(footnote = "Within-species (i.e. species-demeaned)",
             locations = cells_body(
                                    columns = Trans,
                                    rows = 3
             )
             )
dsa |> tab_options(quarto.disable_processing = TRUE)

I pinguini delle Palmer
Caratteri misurati
Caratteri misuratiTransN/TMeanSDMinMaxSkewKurt
bill_length_mmOverall134243.921935.45958432.1000059.600000.052884812.119235
bill_length_mmBetween2345.043365.45498938.7913948.83382-0.660186411.500000
bill_length_mmWithin311443.921932.95116135.9881156.017050.287966883.530494
bill_depth_mmOverall34217.151171.97479313.1000021.50000-0.142834632.088845
bill_depth_mmBetween317.249691.96412614.9821118.42059-0.705970721.500000
bill_depth_mmWithin11417.151171.11753214.3048120.304810.258922152.727361
flipper_length_mmOverall342200.9152014.061714172.00000231.000000.344163832.012566
flipper_length_mmBetween3200.9880514.332413189.95364217.186990.576029921.500000
flipper_length_mmWithin114200.915206.622023182.96156220.961560.165011502.925426
body_mass_gOverall3424201.75439801.9545362700.000006300.000000.468263962.273757
body_mass_gBetween34169.92225784.8679053700.662255076.016260.705749241.500000
body_mass_gWithin1144201.75439460.9167303075.738135425.738130.181655432.507951
1 Overall è riferito a tutte le osservazioni
2 Between-species (i.e. species averaged)
3 Within-species (i.e. species-demeaned)

Table 4: Variabilità dei caratteri fisici

Spero che queste poche note facciano incuriosire qualcuno.