Un paio di considerazioni:
Ad es.:
# Creiamo una serie di dati
data <- c(rep("2011/10/22", 2), "2011/10/23", rep("2011/10/24", 5),
"2011/10/25", rep("2011/10/26", 3))
utente <- c(223344, 223345, 223341, 223341, 223342, 223348, 223344,
223340, 223355, 223344, 223348, 223366)
diagnosi <- c(1, 2, 6, 6, 4, 2, 2, 3, 7, 2, 3, 1)
df <- data.frame(data = data, utente = utente, diagnosi = diagnosi)
Che ci dà questa serie di dati
data utente diagnosi
1 2011/10/22 223344 1 <-
2 2011/10/22 223345 2
3 2011/10/23 223341 6
4 2011/10/24 223341 6
5 2011/10/24 223342 4
6 2011/10/24 223348 2
7 2011/10/24 223344 2 <-
8 2011/10/24 223340 3
9 2011/10/25 223355 7
10 2011/10/26 223344 2 <-
11 2011/10/26 223348 3
12 2011/10/26 223366 1
Ad es. il paziente 223344 ha 3 ricoveri, 2 con diagnosi 2 e uno con diagnosi 1 (come indicato dalle frecce)
Se facciamo:
tb <- table(df$utente, df$diagnosi)
tb
1 2 3 4 6 7
223340 0 0 1 0 0 0
223341 0 0 0 0 2 0
223342 0 0 0 1 0 0
223344 1 2 0 0 0 0
223345 0 1 0 0 0 0
223348 0 1 1 0 0 0
223355 0 0 0 0 0 1
223366 1 0 0 0 0 0
Già possiamo vedere il numero di visite per ciascun paziente
num.visite <- rowSums(tb)
num.visite
223340 223341 223342 223344 223345 223348 223355 223366
1 2 1 3 1 2 1 1
Possiamo vedere chi ha avuto più di una visita con la stessa diagnosi
Troviamo innanzitutto gli id degli elementi della tabella che sono > 1
ids <- which(tb>1)
Gli ID (12 e 34) sono difficili da comprendere così come sono... ma possiamo trovare i labels associati
# col e row trovano il numero della colonna/riga associate ai vari id e
# poi li usiamo questi per indicizzare nomi di colonne e di righe
pazienti <- data.frame(utente=rownames(tb)[row(tb)[ids]],
diagnosi=colnames(tb)[col(tb)[ids]])
utente diagnosi
1 223344 2
2 223341 6
Poi, possiamo vedere quando queste visite sono state fatte
# Applichiamo una funzione a tutti i pazienti con piu' di una diagnosi
visite <- apply(pazienti, 1, function(p)
{
# Troviamo gli id corrispondenti alla coppia utente/diagnosi
ids <- which(df$utente==p[1] & df$diagnosi==p[2])
# Troviamo le entries del database corrispondenti
res <- df[ids,]
# Restituiamo il valore
res
})
visite
[[1]]
data utente diagnosi
7 2011/10/24 223344 2
10 2011/10/26 223344 2
[[2]]
data utente diagnosi
3 2011/10/23 223341 6
4 2011/10/24 223341 6
Apply ci restituisce una lista con le informazioni richieste (nota che per accedere agli elementi della lista devi usare le doppie quadre, ad es. visite[[1]])
Insomma, poi puoi automatizzare il tutto a seconda di cosa vuoi vedere esattamente, ma spero che questi esempi ti possano essere d'aiuto.
Infine, altra funzione che potre interessante potrebbe essere aggregate, anche se a volte è più complicato usarla...
Ad es, qualcosa del tipo:
aggregate(df$data, by=list(diagnosi=df$diagnosi, utente=df$utente), FUN=length)
diagnosi utente x
1 3 223340 1
2 6 223341 2
3 4 223342 1
4 1 223344 1
5 2 223344 2
6 2 223345 1
7 2 223348 1
8 3 223348 1
9 7 223355 1
10 1 223366 1