2013-04-05 10 views
6

Sono un novellino appassionato di R che ha bisogno di aiuto! :)Contare il numero di istanze in cui una variabile o una combinazione di variabili sono TRUE

Ho un frame di dati che assomiglia a questo:

id<-c(100,200,300,400) 
a<-c(1,1,0,1) 
b<-c(1,0,1,0) 
c<-c(0,0,1,1) 

y=data.frame(id=id,a=a,b=b,c=c) 

Dove id è un identificatore univoco (ad esempio, una persona) e un, b e c sono manichino variabili per se la persona ha questa caratteristica o no (come sempre 1 = VERO).

Desidero che R crei una matrice o un frame di dati in cui sono presenti le variabili a, bec come il nome delle colonne e delle righe. Per i valori della matrice R dovrà calcolare il numero di identificatori che hanno questa caratteristica, o la combinazione di caratteristiche.

Quindi, ad esempio, gli ID 100, 200 e 400 hanno un simbolo nella diagonale della matrice dove a e una croce, R immetteranno 3. Solo l'ID 100 ha entrambe le caratteristiche a e b, quindi R inserirà 1 dove a e b attraversano, e così via.

Il frame dati risultanti dovrà assomigliare a questo:

l<-c("","a","b","c") 
m<-c("a",3,1,1) 
n<-c("b",1,2,1) 
o<-c("c",1,1,2) 
result<-matrix(c(l,m,n,o),nrow=4,ncol=4) 

Come il mio insieme di dati ha 10 variabili e centinaia di osservazioni, avrò di automatizzare l'intero processo.

Il vostro aiuto sarà molto apprezzato. Grazie mille!

risposta

8

Con base R:

crossprod(as.matrix(y[,-1])) 
# a b c 
# a 3 1 1 
# b 1 2 1 
# c 1 1 2 
+0

+1 Mi piace soluzioni semplici ed eleganti come questo –

+0

Grazie molto Josh! –

+0

@NikolayNenov - Nessun problema. Apprezzo sempre una domanda ben formulata con un esempio riproducibile! Se le nostre risposte corrispondono al disegno di legge, puoi "accettare" uno di essi (entrambi sembrano accettabili per me) facendo clic sul segno di spunta alla sua sinistra. –

3

Questa è chiamata matrice di adiacenza. È possibile farlo abbastanza facilmente con il pacchetto qdap:

library(qdap) 
adjmat(y[,-1])$adjacency 

## a b c 
## a 3 1 1 
## b 1 2 1 
## c 1 1 2 

Si lancia un avvertimento perché si sta alimentando un dataframe. Non è un grosso problema e può essere ignorato. Ho notato anche che ho lasciato cadere la prima colonna (ID) con indicizzazione negativa y[, -1].

Nota che perché hai iniziato con una matrice booleana si potrebbe avere ottenuto là con:

Y <- as.matrix(y[,-1]) 
t(Y) %*% Y 
Problemi correlati