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.
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.
# 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
)# 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"))# 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"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
)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))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 != "")| 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).
| Germe | N | % |
|---|---|---|
| non isolato | 24 | 38.7% |
|
12 | 19.4% |
| klebsiella | 10 | 16.1% |
|
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.
| Risultato | N | % |
|---|---|---|
| negativo | 56 | 72.7% |
| mrse | 6 | 7.8% |
| klebsiella | 5 | 6.5% |
| mssa | 5 | 6.5% |
|
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.
| Germe | N | % |
|---|---|---|
|
22 | 32.4% |
| negativo | 21 | 30.9% |
| klebsiella | 11 | 16.2% |
| pseudomonas | 7 | 10.3% |
|
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.
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.
| 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.
| 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.
| 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.
| 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.
| 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.
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:
separate_rows() per garantire il conteggio corretto a
livello di singolo patogeno.no < si).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