library(readr); library(dplyr); library(gt); library(stringr); library(tidyr)
# ===== Helpers per robustezza =====
<- function(df) {
standardize_cols <- list(
mapping case = c("case","Case","cohort","subset","Group","group"),
gene = c("gene","Gene","Hugo_Symbol","Symbol"),
variant = c("variant","Variant","cDNA","cdna_change","hgvsc","hgvsc_short","c_change","mutation","c_variant","c_hgvs"),
protein_change = c("protein_change","Protein","hgvsp","hgvsp_short","p_change","aa_change","p_hgvs","protein"),
effect = c("consequence","effect","variant_effect","Consequence"),
classification = c("classification","class","pathogenicity","clin_sig","clinical_significance","significance"),
escat = c("escat","ESCAT"),
tier_amp_asco_cap = c("tier_amp_asco_cap","tier","tier_amp","amp_asco_cap_tier","amp_asco_cap"),
vaf = c("vaf","VAF","allele_fraction","variant_allele_frequency","AF"),
depth = c("depth","coverage","dp","read_depth","DP"),
pd_l1_cps = c("pd_l1_cps","PDL1_CPS","PDL1","pd-l1","pdl1"),
msi_status = c("msi_status","MSI","msi","mismatch_repair"),
tmb = c("tmb","TMB","tumor_mutational_burden","mutational_burden"),
her2_ihc = c("her2_ihc","HER2_IHC","ihc_her2"),
her2_ish = c("her2_ish","HER2_ISH","fish_her2"),
notes = c("notes","note","comment","comments","interpretation","report_note")
)for (tgt in names(mapping)) {
<- mapping[[tgt]][mapping[[tgt]] %in% names(df)]
hit if (length(hit) >= 1) df[[tgt]] <- df[[hit[1]]] else df[[tgt]] <- NA
}
df
}
# carica dati
<- read_csv("data/breast_variants_somatic.csv", show_col_types = FALSE)
som1 <- som1 %>%
som rename(
variant = variant_cDNA,
protein_change = variant_protein,
tier_amp_asco_cap = tier_amp_ascocap, # corregge il typo
notes = evidence_summary
%>%
) mutate(
VAF = suppressWarnings(as.numeric(vaf)),
Copertura = suppressWarnings(as.numeric(depth))
)
# (opzionale) se vuoi tenere anche le copy-number in tabella
# le rinominiamo in "CN" per chiarezza:
if ("copy_number" %in% names(som)) {
<- som %>% rename(CN = copy_number)
som
}
# ---- FUNZIONE TABELLA ROBUSTA ----
<- function(df, caption) {
mk_table # seleziona solo le colonne che esistono
<- df %>%
disp select(any_of(c(
"gene","variant","protein_change","effect","CN",
"escat","tier_amp_asco_cap","VAF","Copertura","notes"
%>%
))) rename(
Gene = gene,
Variante = variant,
Proteina = protein_change,
Effetto = effect,
ESCAT = escat,
Tier = tier_amp_asco_cap,
Note = notes
)
gt(disp) |>
tab_caption(caption) |>
fmt_number(columns = any_of(c("VAF")), decimals = 3) |>
tab_spanner(label = "Qualità", columns = intersect(c("VAF","Copertura"), names(disp))) |>
tab_source_note(md("**Nota**: VAF/Copertura mostrate solo se presenti."))
}
<-som |> standardize_cols()
som
<- read_csv("data/breast_variants_germline.csv", show_col_types = FALSE) |> standardize_cols()
germ
# coerenza tipi numerici dove esistono
<- som |>
som mutate(vaf_num = suppressWarnings(as.numeric(vaf)),
depth_num = suppressWarnings(as.numeric(depth)),
tmb_num = suppressWarnings(as.numeric(tmb)),
pd_l1_cps_num = suppressWarnings(as.numeric(pd_l1_cps)))
<- germ %>%
germ # crea le colonne numeriche solo se quelle originali esistono
mutate(across(any_of(c("vaf","depth")),
~ suppressWarnings(as.numeric(.x)),
.names = "{.col}_num")) #suppressWarnings(as.numeric(depth)) else NA_real_)
# utility per rendering tabella pulita (funziona anche se VAF/Depth non esistono)
<- function(df, caption) {
mk_table # assicura colonne opzionali
if (!("vaf_num" %in% names(df))) df$vaf_num <- NA_real_
if (!("depth_num" %in% names(df))) df$depth_num <- NA_real_
<- df |>
disp select(any_of(c("gene","variant","protein_change","effect","classification",
"escat","tier_amp_asco_cap","vaf_num","depth_num","notes"))) |>
rename(Gene = gene, Variante = variant, Proteina = protein_change, Effetto = effect,
Classe = classification, ESCAT = escat, Tier = tier_amp_asco_cap,
VAF = vaf_num, Copertura = depth_num, Note = notes)
gt(disp) |>
tab_caption(caption) |>
fmt_number(columns = c("VAF"), decimals = 3) |>
tab_spanner(label = "Qualità", columns = c("VAF","Copertura")) |>
tab_source_note(md("**Nota**: VAF e copertura sono riportate solo se presenti nei file sorgente."))
}
6 Mammella — Casi MTB (HR+/HER2− e TNBC)
6.1 HR+/HER2− — Varianti di interesse
%>% filter(case %in% c("HRpos_HER2neg","HR+_HER2-","HRpos")) %>% select(-any_of("case")) %>%
som mk_table("HR+/HER2− — Varianti somatiche")
Gene | Variante | Proteina | Effetto | Classe | ESCAT | Tier |
Qualità
|
Note | |
---|---|---|---|---|---|---|---|---|---|
VAF | Copertura | ||||||||
PIK3CA | c.3140A>G | p.H1047R | Activating | NA | I-A | Tier IA | 0.310 | 480 | Enables PI3K inhibitor (alpelisib) with endocrine therapy. |
ESR1 | c.1610A>C | p.Y537S | Activating | NA | II | Tier IIA | 0.120 | 420 | Resistance marker; SERD consideration. |
Nota: VAF e copertura sono riportate solo se presenti nei file sorgente. |
6.1.1 Suggerimenti clinici (HR+/HER2−, aggiornati al 2025)
- ESR1 mutato → elacestrant (SERD orale) in progressione a ET/CDK4/6 se ESR1+ (test liquido o tessuto con CDx). [FDA 27-01-2023]
Note: utilità maggiore dopo CDK4/6i e in malattia sensibile all’ET.
- PIK3CA/AKT1/PTEN alterati → capivasertib + fulvestrant (post-ET) o alpelisib + ET per PIK3CA mut selezionate.
- HER2-low (IHC 1+ o 2+/ISH−) → nelle linee successive, considerare trastuzumab deruxtecan (T‑DXd).
- MSI‑H/TMB‑high (raro) → opzione pembrolizumab tissue‑agnostic.
- NTRK fusion (rarissimo) → larotrectinib o entrectinib.
Razionale/Fonti principali: ESMO Living Guideline 2025 HR+/HER2−; FDA label elacestrant; FDA label capivasertib; DESTINY‑Breast04 per T‑DXd.
6.2 TNBC — Varianti di interesse
%>% filter(case %in% c("TNBC","TripleNegative")) %>% select(-any_of("case")) %>%
som mk_table("TNBC — Varianti somatiche")
Gene | Variante | Proteina | Effetto | Classe | ESCAT | Tier |
Qualità
|
Note | |
---|---|---|---|---|---|---|---|---|---|
VAF | Copertura | ||||||||
BRCA1 | c.5266dupC | p.Gln1756Profs*74 | Pathogenic (LOF) | NA | I-A | Tier IA | 0.440 | 500 | PARP inhibitor eligibility in germline carriers. |
Nota: VAF e copertura sono riportate solo se presenti nei file sorgente. |
6.2.1 Suggerimenti clinici (TNBC, aggiornati al 2025)
- PD‑L1 CPS ≥10 (prima linea metastatica) → pembrolizumab + chemioterapia (KEYNOTE‑355).
- Dopo ≥1 linea (HR−/HER2−): sacituzumab govitecan (Trop‑2 ADC) ha dimostrato beneficio OS vs TPC.
- gBRCA1/2 → PARP inibitori (olaparib/talazoparib).
- HER2‑low (sottogruppo di TNBC) → candidabile a T‑DXd in linee successive.
- NTRK fusions (raro) → larotrectinib/entrectinib.
- MSI‑H/TMB‑high → pembrolizumab tissue‑agnostic.
Razionale/Fonti principali: KEYNOTE‑355 per pembrolizumab; ASCENT/TROPiCS‑02 e aggiornamenti 2025 per sacituzumab govitecan; DESTINY‑Breast04 per T‑DXd.
6.3 Germinale
mk_table(germ, "Mammella — Varianti germinali")
Gene | Variante | Proteina | Effetto | Classe | ESCAT | Tier |
Qualità
|
Note | |
---|---|---|---|---|---|---|---|---|---|
VAF | Copertura | ||||||||
BRCA1 | NA | NA | NA | Pathogenic | NA | NA | NA | NA | Recommend germline testing and genetic counseling. |
— | NA | NA | NA | No pathogenic variants suspected | NA | NA | NA | NA | Germline per storia personale/familiare. |
Nota: VAF e copertura sono riportate solo se presenti nei file sorgente. |
Nota
Indicazioni pratiche
- PIK3CA p.H1047R → considerare alpelisib + ET (alternativa a capivasertib+fulvestrant in HR+/HER2− con PIK3CA).
- ESR1 patogena → elacestrant dopo ET/CDK4/6i.
- BRCA1/2 patogena (specialmente TNBC) → PARP; invio a genetica medica e cascade testing.
- PD‑L1 CPS ≥10 in TNBC → pembrolizumab + chemio in prima linea.
- HER2‑low → T‑DXd in setting avanzato dopo almeno una chemioterapia.
6.4 Riferimenti (principali, per pronta consultazione)
- ESMO Living Guideline (Aprile 2025) — HR+/HER2− MBC: https://www.esmo.org/guidelines/living-guidelines/esmo-living-guideline-metastatic-breast-cancer/hr-positive-her2-negative-metastatic-breast-cancer/hr-her2-mbc-progressive-disease-candidate-for-endocrine-therapy-targeted-therapy
- FDA — Elacestrant (ESR1‑mut, ER+/HER2−): https://www.fda.gov/drugs/resources-information-approved-drugs/fda-approves-elacestrant-er-positive-her2-negative-esr1-mutated-advanced-or-metastatic-breast-cancer
- FDA — Capivasertib + fulvestrant (PIK3CA/AKT1/PTEN‑alter): https://www.fda.gov/drugs/resources-information-approved-drugs/fda-approves-capivasertib-fulvestrant-breast-cancer
- DESTINY‑Breast04 — T‑DXd in HER2‑low: https://www.nejm.org/doi/full/10.1056/NEJMoa2203690
- KEYNOTE‑355 — Pembrolizumab + chemio in TNBC PD‑L1 CPS≥10: https://pubmed.ncbi.nlm.nih.gov/35857659/
- TROPiCS‑02 / ASCENT — Sacituzumab govitecan: https://www.thelancet.com/journals/lancet/article/PIIS0140-6736%2823%2901245-X/fulltext ; https://ascopubs.org/doi/10.1200/JCO.2023.41.16_suppl.1003 ; https://pmc.ncbi.nlm.nih.gov/articles/PMC12257498/