2011-08-25 10 views
9

Qual è il modo migliore per determinare un fattore o creare un nuovo campo di categoria in base a un numero di campi booleani? In questo esempio, ho bisogno di contare il numero di combinazioni uniche di farmaci.Come contare il numero di combinazioni di dati booleani in R

> MultPsychMeds 
     ID OLANZAPINE HALOPERIDOL QUETIAPINE RISPERIDONE 
    1 A   1   1   0   0 
    2 B   1   0   1   0 
    3 C   1   0   1   0 
    4 D   1   0   1   0 
    5 E   1   0   0   1 
    6 F   1   0   0   1 
    7 G   1   0   0   1 
    8 H   1   0   0   1 
    9 I   0   1   1   0 
    10 J   0   1   1   0 

Forse un altro modo per dirlo è che ho bisogno di ruotare o incrociare le coppie tabulate. I risultati finali hanno bisogno di guardare qualcosa di simile:

Combination   Count 
OLANZAPINE/HALOPERIDOL  1 
OLANZAPINE/QUETIAPINE  3 
OLANZAPINE/RISPERIDONE  4 
HALOPERIDOL/QUETIAPINE  2 

Questa cornice di dati può essere replicata in R con:

MultPsychMeds <- structure(list(ID = structure(1:10, .Label = c("A", "B", "C", 
"D", "E", "F", "G", "H", "I", "J"), class = "factor"), OLANZAPINE = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L), HALOPERIDOL = c(1L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L), QUETIAPINE = c(0L, 1L, 1L, 1L, 
0L, 0L, 0L, 0L, 1L, 1L), RISPERIDONE = c(0L, 0L, 0L, 0L, 1L, 
1L, 1L, 1L, 0L, 0L)), .Names = c("ID", "OLANZAPINE", "HALOPERIDOL", 
"QUETIAPINE", "RISPERIDONE"), class = "data.frame", row.names = c(NA, 
-10L)) 
+2

+1 di fornire i dati. Tuttavia, credo che sia necessario aggiornare il titolo, in quanto non sembrano esserci booleani (logiche) coinvolti, né c'è alcuna "conversione" in corso. Puoi rivederlo a qualcosa come 'contare il numero di co-occorrenze' o simili? –

+0

Grazie. Rivisto il titolo per abbinare la domanda reale. Per quanto riguarda Boolean, i dati grezzi includono 0 per FALSE e 1 per TRUE e R sta impostando tali variabili su Numeri interi durante il caricamento da file .csv. Questo processo sarebbe meglio se prima venissero convertiti in variabili logiche? – Rollie

+1

Penso che il riferimento a booleana è fine e intuitivo, R equivale 1 & TRUE per essere uno e lo stesso per quanto ne so (ci possono essere casi in cui questo non è vero). Ad esempio, '> 1 == TRUE [1] TRUE – Chase

risposta

8

Ecco uno approccio utilizzando le reshape e plyr pacchetti:

library(reshape) 
library(plyr) 

#Melt into long format 
dat.m <- melt(MultPsychMeds, id.vars = "ID") 
#Group at the ID level and paste the drugs together with "/" 
out <- ddply(dat.m, "ID", summarize, combos = paste(variable[value == 1], collapse = "/")) 

#Calculate a table 
with(out, count(combos)) 

         x freq 
1 HALOPERIDOL/QUETIAPINE 2 
2 OLANZAPINE/HALOPERIDOL 1 
3 OLANZAPINE/QUETIAPINE 3 
4 OLANZAPINE/RISPERIDONE 4 
+0

Questo è molto utile ed è proprio quello che stavo cercando. Grazie – Rollie

5

Solo per divertimento, una soluzione R di base (che può essere trasformata in un oneliner :-)):

data.frame(table(apply(MultPsychMeds[,-1], 1, function(currow){ 
    wc<-which(currow==1) 
    paste(colnames(MultPsychMeds)[wc+1], collapse="/") 
}))) 
2

Un altro modo potrebbe essere:

subset(
    as.data.frame(
     with(MultPsychMeds, table(OLANZAPINE, HALOPERIDOL, QUETIAPINE, RISPERIDONE)), 
     responseName="count" 
    ), 
    count>0 
) 

che dà

OLANZAPINE HALOPERIDOL QUETIAPINE RISPERIDONE count 
4   1   1   0   0  1 
6   1   0   1   0  3 
7   0   1   1   0  2 
10   1   0   0   1  4 

Non è un modo esatto che si desidera, ma è veloce e semplice.


V'è una scorciatoia in plyr package:

require(plyr) 
count(MultPsychMeds, c("OLANZAPINE", "HALOPERIDOL", "QUETIAPINE", "RISPERIDONE")) 
# OLANZAPINE HALOPERIDOL QUETIAPINE RISPERIDONE freq 
# 1   0   1   1   0 2 
# 2   1   0   0   1 4 
# 3   1   0   1   0 3 
# 4   1   1   0   0 1 
Problemi correlati