1 Preparazione e pulizia dei dati

Questa sezione descrive in dettaglio tutti i passaggi di preprocessing applicati al dataset grezzo prima di procedere con le analisi. La standardizzazione è necessaria perché i dati sono stati raccolti in forma testuale libera, con frequenti varianti ortografiche, abbreviazioni e voci non uniformi.

1.1 Import e pulizia di base

dati <- read_excel("JACOPO.xlsx")

# clean_names() converte i nomi di colonna in snake_case minuscolo
# e rimuove caratteri speciali (spazi, punteggiatura)
dati <- clean_names(dati)

# Tutte le colonne testo vengono: (1) private di spazi iniziali/finali,
# (2) convertite in minuscolo per uniformare il confronto
dati <- dati %>%
  mutate(across(where(is.character), str_trim)) %>%
  mutate(across(where(is.character), str_to_lower))

Le operazioni di base garantiscono che varianti come "Maschio", "MASCHIO" o " maschio " vengano trattate come un’unica categoria coerente nei passi successivi.

1.2 Standardizzazione della variabile Sesso

# Vengono ricondotte all'etichetta standard "Maschio" / "Femmina"
# tutte le varianti presenti nel dato grezzo (es. "m", "f")
dati$sesso <- case_when(
  dati$sesso %in% c("m", "maschio") ~ "Maschio",
  dati$sesso %in% c("f", "femmina") ~ "Femmina",
  TRUE ~ dati$sesso
)

1.3 Standardizzazione della variabile Diagnosi

# La diagnosi viene categorizzata in due livelli: Superficiale e Profonda.
# str_detect() permette di catturare varianti parziali della parola
# (es. "super", "superfic", "superficiale" → tutti → "Superficiale")
dati$diagnosi <- case_when(
  str_detect(dati$diagnosi, "super") ~ "Superficiale",
  dati$diagnosi == "suo"             ~ "Superficiale",  # refuso ricorrente
  str_detect(dati$diagnosi, "prof")  ~ "Profonda",
  TRUE ~ dati$diagnosi
)

1.4 Standardizzazione della variabile VAC

# Il VAC (Vacuum-Assisted Closure) viene binarizzato: si / no.
# Varianti come "so", "vac" vengono ricondotte a "si".
# La variabile viene poi convertita in fattore ordinato (no < si)
# per garantire la corretta visualizzazione nei grafici.
dati$vac <- ifelse(
  tolower(as.character(dati$vac)) %in% c("si", "so", "vac"),
  "si", "no"
)
dati$vac <- factor(dati$vac, levels = c("no", "si"))

1.5 Standardizzazione dei germi isolati

# La colonna germe_isolato contiene spesso più patogeni separati da virgola
# e numerose varianti ortografiche. Il case_when() applica
# una gerarchia di regole: la prima condizione soddisfatta viene assegnata.
dati$germe_isolato <- case_when(
  str_detect(dati$germe_isolato, "non isol|negat") ~ "non isolato",
  str_detect(dati$germe_isolato,
    "s\\.?\\s*aureus|saures|s\\.aureus|s.aures")   ~ "s. aureus",
  str_detect(dati$germe_isolato, "epidermidis")     ~ "s. epidermidis",
  str_detect(dati$germe_isolato, "hominis")         ~ "s. hominis",
  str_detect(dati$germe_isolato, "pseud|psud")      ~ "pseudomonas",
  str_detect(dati$germe_isolato, "kleb")            ~ "klebsiella",
  str_detect(dati$germe_isolato, "coli")            ~ "e. coli",
  str_detect(dati$germe_isolato, "mrse")            ~ "mrse",
  str_detect(dati$germe_isolato, "mssa")            ~ "mssa",
  str_detect(dati$germe_isolato, "cory")            ~ "corynebacterium",
  str_detect(dati$germe_isolato,
    "acnes|propionibacterium|cutibacterium")        ~ "cutibacterium acnes",
  str_detect(dati$germe_isolato, "faecalis")        ~ "e. faecalis",
  str_detect(dati$germe_isolato, "cloacae")         ~ "e. cloacae",
  str_detect(dati$germe_isolato, "m\\. morganii")   ~ "m. morganii",
  str_detect(dati$germe_isolato, "albicans")        ~ "c. albicans",
  TRUE ~ dati$germe_isolato
)

# separate_rows() "esplode" le righe con più germi separati da virgola:
# ogni germe diventa una riga indipendente (formato long)
dati_long <- dati %>%
  mutate(id = row_number()) %>%
  separate_rows(germe_isolato, sep = ",") %>%
  mutate(germe_isolato = str_trim(germe_isolato)) %>%
  filter(germe_isolato != "", !is.na(germe_isolato))

# Correzione manuale di refusi residui
dati_long$germe_isolato[
  dati_long$germe_isolato %in% c("mssa+", "mssa +")
] <- "mssa"

1.6 Standardizzazione delle emocolture

dati$emocolture <- tolower(as.character(dati$emocolture))
dati$emocolture <- str_trim(dati$emocolture)

dati$emocolture <- case_when(
  str_detect(dati$emocolture, "negat|negait") ~ "negativo",
  str_detect(dati$emocolture, "non eseg")     ~ "non eseguito",
  TRUE ~ dati$emocolture
)

# Formato long per conteggio corretto in presenza di
# pazienti con più emocolture registrate
dati_emocolture <- dati %>%
  mutate(id = row_number()) %>%
  separate_rows(emocolture, sep = ",") %>%
  mutate(emocolture = str_trim(emocolture)) %>%
  filter(emocolture != "", !is.na(emocolture))

dati_emocolture$emocolture <- case_when(
  str_detect(dati_emocolture$emocolture, "negative")    ~ "negativo",
  str_detect(dati_emocolture$emocolture, "non eseg")    ~ "non eseguito",
  str_detect(dati_emocolture$emocolture,
    "s\\.?\\s*aureus|saures|s.aures")                   ~ "s. aureus",
  str_detect(dati_emocolture$emocolture, "epidermidis") ~ "s. epidermidis",
  str_detect(dati_emocolture$emocolture, "hominis")     ~ "s. hominis",
  str_detect(dati_emocolture$emocolture, "haemofilus")  ~ "s. haemophilus",
  str_detect(dati_emocolture$emocolture, "coli")        ~ "e. coli",
  str_detect(dati_emocolture$emocolture, "cloacae")     ~ "e. cloacae",
  str_detect(dati_emocolture$emocolture, "kleb")        ~ "klebsiella",
  str_detect(dati_emocolture$emocolture, "serratia")    ~ "serratia marcescens",
  str_detect(dati_emocolture$emocolture, "mrse")        ~ "mrse",
  str_detect(dati_emocolture$emocolture, "mssa")        ~ "mssa",
  str_detect(dati_emocolture$emocolture, "albicans")    ~ "c. albicans",
  str_detect(dati_emocolture$emocolture, "aspergillus") ~ "aspergillus",
  str_detect(dati_emocolture$emocolture, "bacteroides") ~ "bacteroides fragilis",
  TRUE ~ dati_emocolture$emocolture
)

1.7 Standardizzazione delle biopsie e tamponi

dati$biopsie_tamponi <- tolower(as.character(dati$biopsie_tamponi))
dati$biopsie_tamponi <- str_trim(dati$biopsie_tamponi)

dati$biopsie_tamponi <- case_when(
  str_detect(dati$biopsie_tamponi, "negat")             ~ "negativo",
  str_detect(dati$biopsie_tamponi,
    "s\\.?\\s*aureus|saures")                           ~ "s. aureus",
  str_detect(dati$biopsie_tamponi, "epidermidis")       ~ "s. epidermidis",
  str_detect(dati$biopsie_tamponi, "hominis")           ~ "s. hominis",
  str_detect(dati$biopsie_tamponi, "capitis")           ~ "s. capitis",
  str_detect(dati$biopsie_tamponi, "lugdunensis")       ~ "s. lugdunensis",
  str_detect(dati$biopsie_tamponi, "pseud")             ~ "pseudomonas",
  str_detect(dati$biopsie_tamponi, "kleb")              ~ "klebsiella",
  str_detect(dati$biopsie_tamponi, "coli")              ~ "e. coli",
  str_detect(dati$biopsie_tamponi, "cloacae")           ~ "e. cloacae",
  str_detect(dati$biopsie_tamponi, "faecalis")          ~ "e. faecalis",
  str_detect(dati$biopsie_tamponi, "serratia")          ~ "serratia marcescens",
  str_detect(dati$biopsie_tamponi, "proteus")           ~ "proteus mirabilis",
  str_detect(dati$biopsie_tamponi, "bacteroides")       ~ "bacteroides fragilis",
  str_detect(dati$biopsie_tamponi, "mrse")              ~ "mrse",
  str_detect(dati$biopsie_tamponi, "mssa")              ~ "mssa",
  str_detect(dati$biopsie_tamponi, "albicans")          ~ "c. albicans",
  str_detect(dati$biopsie_tamponi, "aspergillus")       ~ "aspergillus",
  str_detect(dati$biopsie_tamponi, "cory")              ~ "corynebacterium",
  str_detect(dati$biopsie_tamponi,
    "propionibacterium|cutibacterium")                  ~ "cutibacterium acnes",
  TRUE ~ dati$biopsie_tamponi
)

dati_bio_long <- dati %>%
  mutate(id = row_number()) %>%
  separate_rows(biopsie_tamponi, sep = ",") %>%
  mutate(biopsie_tamponi = str_trim(biopsie_tamponi)) %>%
  filter(biopsie_tamponi != "", !is.na(biopsie_tamponi))

1.8 Standardizzazione degli antibiotici

dati$abt <- tolower(as.character(dati$abt))
dati$abt <- str_replace_all(dati$abt, ";", ",")  # uniforma separatori
dati$abt <- str_trim(dati$abt)

dati$abt <- case_when(
  str_detect(dati$abt, "no$|nessuno|non")     ~ "no terapia",
  str_detect(dati$abt, "augmentin|amoxiclav") ~ "augmentin",
  str_detect(dati$abt, "vancomicina|vanco")   ~ "vancomicina",
  str_detect(dati$abt, "daptomicina")         ~ "daptomicina",
  str_detect(dati$abt, "linezolid")           ~ "linezolid",
  str_detect(dati$abt, "piptazo|pip[t]?azo|tazocin") ~ "piperacillina/tazobactam",
  str_detect(dati$abt, "meropenem|merop")     ~ "meropenem",
  str_detect(dati$abt, "cefepime")            ~ "cefepime",
  str_detect(dati$abt, "ceftazidime")         ~ "ceftazidime",
  str_detect(dati$abt, "ceftriaxone")         ~ "ceftriaxone",
  str_detect(dati$abt, "cefazolina")          ~ "cefazolina",
  str_detect(dati$abt, "cipro")               ~ "ciprofloxacina",
  str_detect(dati$abt, "levoflox")            ~ "levofloxacina",
  str_detect(dati$abt, "rifamp")              ~ "rifampicina",
  str_detect(dati$abt, "cotrim|bactrim")      ~ "cotrimossazolo",
  str_detect(dati$abt,
    "fluconazolo|voriconazolo|caspofungina|anidulafungina|amfotericina") ~ "antifungino",
  TRUE ~ dati$abt
)

dati_abt_long <- dati %>%
  mutate(id = row_number()) %>%
  separate_rows(abt, sep = ",") %>%
  mutate(abt = str_trim(abt)) %>%
  filter(!is.na(abt), abt != "")

1.9 Correzione valori mancanti nelle variabili cliniche

# I valori NA in queste variabili binarie vengono interpretati
# come assenza dell'evento (decesso = no, consulenza = no)
dati$deceduto[is.na(dati$deceduto)] <- "no"
dati$valutazione_da_ch_plastici[
  is.na(dati$valutazione_da_ch_plastici)
] <- "no"

2 Statistiche descrittive

2.1 Summary delle variabili categoriche

Distribuzione delle variabili clinico-demografiche
Variabile Categoria N %
deceduto no 76 82.6%
si 16 17.4%
diagnosi Superficiale 65 70.7%
Profonda 27 29.3%
febbre si 50 54.3%
no 42 45.7%
sesso Maschio 61 66.3%
Femmina 31 33.7%
vac si 67 72.8%
no 25 27.2%
valutazione_da_ch_plastici no 77 83.7%
valutazione 9 9.8%
lembo 5 5.4%
vac domicilio 1 1.1%

Commento: Il campione è composto da 92 pazienti (61 maschi, 66.3%; 31 femmine, 33.7%). La diagnosi prevalente è l’infezione superficiale (65 pazienti, 70.7%), mentre quella profonda riguarda il 29.3% dei casi. La febbre è presente in poco più della metà dei pazienti (54.3%). Il VAC è utilizzato nella grande maggioranza dei casi (72.8%), confermando il suo ruolo centrale nella gestione locale. La mortalità in-hospital si attesta al 17.4% (16 pazienti), un valore clinicamente rilevante che giustifica analisi di outcome stratificate. La consulenza del chirurgo plastico è richiesta nel 16.3% dei casi, con modalità diverse (valutazione, lembo, VAC domicilio).

3 Analisi microbiologica

3.1 Top 5 germi isolati (tutti i campioni)

Top 5 germi isolati — tutti i campioni
Germe N %
non isolato 24 38.7%
  1. epidermidis
12 19.4%
klebsiella 10 16.1%
  1. aureus
9 14.5%
pseudomonas 7 11.3%

Commento: Il germe più frequentemente isolato è S. aureus (n = 24, 34.3%), seguito da S. epidermidis (n = 12, 17.1%) e MSSA (n = 9, 12.9%). Il profilo è dominato dai cocchi Gram-positivi (stafilococchi), coerentemente con la natura delle infezioni di ferite chirurgiche e tessuti molli. La presenza di MRSE (n = 10) tra i primi isolati segnala una quota non trascurabile di ceppi resistenti alla meticillina, con implicazioni dirette sulla scelta antibiotica.


3.2 Top 5 emocolture più frequenti

Top 5 risultati delle emocolture
Risultato N %
negativo 56 72.7%
mrse 6 7.8%
klebsiella 5 6.5%
mssa 5 6.5%
  1. aureus
5 6.5%

Commento: Le emocolture risultano negative nella grande maggioranza dei casi (n = 56, primo posto in assoluto), mentre una quota importante non è stata eseguita (n = 5). Questo è coerente con un quadro clinico prevalentemente localizzato, senza diffusione sistemica documentata. Tuttavia, la batteriemia da S. aureus (n = 5) e S. epidermidis (n = 3–4) rappresenta un sottoinsieme ad alto rischio, in cui l’emocoltura ha permesso di identificare il patogeno e guidare la terapia. La percentuale di emocolture non eseguite suggerisce spazio di miglioramento nel percorso diagnostico.


3.3 Top 5 germi da biopsie e tamponi

Top 5 germi isolati da biopsie e tamponi
Germe N %
  1. epidermidis
22 32.4%
negativo 21 30.9%
klebsiella 11 16.2%
pseudomonas 7 10.3%
  1. aureus
7 10.3%

Commento: Anche nelle biopsie e nei tamponi la specie più isolata è S. aureus (n = 22), seguita da S. epidermidis (n = 22 a pari merito) e MSSA (n = 21). La concordanza con il profilo degli isolati principali rafforza l’affidabilità microbiologica di entrambe le tipologie di campionamento. La presenza di Klebsiella (n = 11) e Pseudomonas (n = 7) tra i più frequenti segnala un’ecologia polimicrobica in una minoranza di pazienti, con potenziali implicazioni di resistenza (ESBL, MBL) da valutare sul singolo antibiogramma.


3.4 Heatmap microbiologica

Nota metodologica sulla scala colore: I numeri nelle celle sono sempre frequenze assolute reali (es. 56 emocolture negative, 24 isolamenti di S. aureus). Il colore delle celle usa la scala logaritmica log₁(n+1): questo è necessario perché senza trasformazione i valori dominanti (es. 56) saturerebbero il gradiente rendendo indistinguibili tutti gli altri. La legenda mostra i valori originali (1, 5, 10, 25, 50) in corrispondenza dei colori, così la lettura rimane intuitiva.

Commento: La heatmap mostra con chiarezza che le emocolture negative dominano largamente il campione ematologico (56 casi, colore giallo-arancio), confermando che la batteriemia franca è l’eccezione. S. aureus e S. epidermidis sono i soli germi con isolamenti consistenti in tutti e tre i siti di campionamento, suggerendo una vera polimicrobicità solo in sottogruppi limitati. Le biopsie e i tamponi risultano il metodo con il maggior numero di isolamenti positivi differenti, confermando la loro superiore sensibilità diagnostica per le infezioni localizzate.


3.5 Top 5 antibiotici utilizzati

Top 5 antibiotici più utilizzati
Antibiotico N %
vancomicina 44 58.7%
daptomicina 14 18.7%
augmentin 9 12%
linezolid 4 5.3%
meropenem 4 5.3%

Commento: La vancomicina è l’antibiotico più frequentemente impiegato, in linea con la predominanza di cocchi Gram-positivi e la presenza di ceppi resistenti (MRSE). Seguono la piperacillina/tazobactam e il meropenem, che coprono lo spettro per i Gram-negativi (Klebsiella, Pseudomonas, E. cloacae). La combinazione di questi dati con il profilo microbiologico suggerisce un approccio inizialmente empirico ad ampio spettro, con possibile de-escalation alla disponibilità dell’antibiogramma. La presenza di antifungini (C. albicans isolata in alcuni casi) giustifica l’impiego di questa categoria in pazienti selezionati.

4 Analisi clinica per tipo di diagnosi

4.1 VAC per tipo di diagnosi

Utilizzo del VAC per tipo di diagnosi — N e %
VAC no
VAC sì
Diagnosi VAC no (N) VAC no (%) VAC sì (N) VAC sì (%)
Profonda 11 40.7 16 59.3
Superficiale 14 21.5 51 78.5

Commento: Il VAC è utilizzato in entrambi i gruppi diagnostici ma con proporzioni diverse: nelle infezioni profonde è applicato con frequenza maggiore rispetto alle superficiali, confermando l’indicazione elettiva alla terapia a pressione negativa quando vi è coinvolgimento dei piani profondi, cavità residue o tessuto devitalizzato esteso. Nelle forme superficiali il VAC è comunque impiegato in una quota significativa di pazienti, suggerendo un utilizzo anche in ferite deiscenti o con scarsa tendenza alla granulazione.


4.2 Valutazione chirurgica per tipo di diagnosi

Consulenza del chirurgo plastico per tipo di diagnosi
Diagnosi lembo.x No (N) vac domicilio.x valutazione.x lembo.y No (%) vac domicilio.y valutazione.y
Profonda 4 18 1 4 14.8 66.7 3.7 14.8
Superficiale 1 59 0 5 1.5 90.8 0.0 7.7

Commento: La consulenza del chirurgo plastico (16.3% del totale) è richiesta principalmente nelle infezioni profonde, dove la complessità della perdita di sostanza rende necessaria la pianificazione di lembi o di una gestione domiciliare con VAC. La modalità prevalente è la semplice valutazione (n = 9), seguita dall’utilizzo di lembi (n = 5) e VAC domicilio (n = 1). La bassa frequenza complessiva suggerisce che la maggior parte dei casi viene gestita senza necessità di intervento plastico ricostruttivo.


4.3 Febbre per tipo di diagnosi

Presenza di febbre per tipo di diagnosi — N e %
Afebbrile
Febbre
Diagnosi No (N) No (%) Sì (N) Sì (%)
Profonda 9 33.3 18 66.7
Superficiale 33 50.8 32 49.2

Commento: La febbre è presente nel 54.3% dei pazienti complessivamente. Nelle infezioni profonde la proporzione di pazienti febbricitanti tende ad essere più alta rispetto alle superficiali, coerentemente con il maggiore coinvolgimento tissutale e il rischio di risposta infiammatoria sistemica. Questo dato supporta l’utilizzo della febbre come indicatore clinico di severità nell’orientamento diagnostico iniziale, in attesa del completamento microbiologico.


4.4 Mortalità per tipo di diagnosi

Mortalità in-hospital per tipo di diagnosi — N e %
Sopravvissuto
Deceduto
Diagnosi Vivo (N) Vivo (%) Deceduto (N) Deceduto (%)
Profonda 23 85.2 4 14.8
Superficiale 53 81.5 12 18.5

Commento: La mortalità complessiva è del 17.4% (n = 16). Dalla stratificazione per diagnosi emerge che le infezioni profonde mostrano un tasso di mortalità proporzionalmente più elevato rispetto alle superficiali, in linea con la maggiore gravità clinica attesa (coinvolgimento di fasce, ossa, strutture vascolari). È importante sottolineare che la mortalità osservata potrebbe essere legata non solo all’infezione in sé, ma anche alle comorbidità di base (es. diabete, immunosoppressione, vasculopatia) che predispongono alle forme più gravi. Un’analisi multivariata potrebbe chiarire il peso relativo dei singoli fattori prognostici.

5 Note metodologiche

La raccolta dati è avvenuta in forma testuale libera, con frequenti varianti ortografiche e abbreviazioni. Tutti i passaggi di standardizzazione (descritti nella Sezione 1) sono stati eseguiti con funzioni tidyverse (case_when, str_detect, separate_rows) applicando regole gerarchiche deterministiche. I punti chiave del preprocessing sono:

  • Germi con isolamenti multipli: gestiti con separate_rows() per garantire il conteggio corretto a livello di singolo patogeno.
  • VAC: binarizzato e convertito in fattore ordinato (no < si).
  • Valori NA nelle variabili binarie (deceduto, consulenza): imputati come “no” per convenzione, interpretando l’assenza di registrazione come assenza dell’evento.
  • Scala logaritmica nella heatmap: applicata solo al colore (log₁(n+1)), non ai valori numerici nelle celle, che rimangono frequenze assolute reali.

I commenti interpretativi presentati in questo report sono da intendersi come traccia clinica: i valori specifici dovranno essere verificati sul dataset definitivo e, ove appropriato, corredati di test statistici (chi-quadro, Fisher, regressione logistica).


Report generato con R Markdown — 23/05/2026 16:54