2013-11-20 20 views
7

Vorrei riassumere lo stato pass/fail per i miei dati come di seguito. In altre parole, vorrei dire il numero di casi passati e non riusciti per ciascun prodotto/tipo.Programmazione R: plyr come contare i valori da una colonna con ddply

library(ggplot2) 
library(plyr) 
product=c("p1","p1","p1","p1","p1","p1","p1","p1","p1","p1","p1","p1","p2","p2","p2","p2","p2","p2","p2","p2","p2","p2","p2","p2") 
type=c("t1","t1","t1","t1","t1","t1","t2","t2","t2","t2","t2","t2","t1","t1","t1","t1","t1","t1","t2","t2","t2","t2","t2","t2") 
skew=c("s1","s1","s1","s2","s2","s2","s1","s1","s1","s2","s2","s2","s1","s1","s1","s2","s2","s2","s1","s1","s1","s2","s2","s2") 
color=c("c1","c2","c3","c1","c2","c3","c1","c2","c3","c1","c2","c3","c1","c2","c3","c1","c2","c3","c1","c2","c3","c1","c2","c3") 
result=c("pass","pass","fail","pass","pass","pass","fail","pass","fail","pass","fail","pass","fail","pass","fail","pass","pass","pass","pass","fail","fail","pass","pass","fail") 
df = data.frame(product, type, skew, color, result) 

Il seguente restituisce cmd il numero totale di passaggio + non riescono casi ma voglio colonne separate per accettazione e di rifiuto

dfSummary <- ddply(df, c("product", "type"), summarise, N=length(result)) 

Risultato è:

 product type N 
1  p1  t1 6 
2  p1  t2 6 
3  p2  t1 6 
4  p2  t2 6 

Il risultato auspicabile sarebbe

  product type Pass Fail 
1  p1  t1 5 1 
2  p1  t2 3 3 
3  p2  t1 4 2 
4  p2  t2 3 3 

Ho tentato somthing come:

dfSummary <- ddply(df, c("product", "type"), summarise, Pass=length(df$product[df$result=="pass"]), Fail=length(df$product[df$result=="fail"])) 

ma ovviamente è sbagliato in quanto i risultati sono il grande totatl per fallire e passare.

Grazie in anticipo per il vostro consiglio! Cordiali saluti, Riad.

risposta

11

Prova:

dfSummary <- ddply(df, c("product", "type"), summarise, 
        Pass=sum(result=="pass"), Fail=sum(result=="fail")) 

Il che mi dà dei risultati:

product type Pass Fail 
1  p1 t1 5 1 
2  p1 t2 3 3 
3  p2 t1 4 2 
4  p2 t2 3 3 

Spiegazione:

  1. Si stanno dando il set di dati, df alla funzione ddply.
  2. ddply è splitting sulle variabili, "prodotto" e "tipo"
    • Ciò provoca length(unique(product)) * length(unique(type)) pezzi (cioè sottoinsiemi di dati df) suddivisi su ogni combinazione delle due variabili.
  3. Con ciascuno dei pezzi, ddply applica alcune funzioni fornite. In questo caso, si contano il numero di result=="pass" e result=="fail" ci sono.
  4. Ora a ddply vengono restituiti alcuni risultati per ogni pezzo, vale a dire le variabili divise (prodotto e tipo) e i risultati richiesti (Passa e Fallisci).
  5. Unisce tutti i pezzi insieme e lo restituisce
+0

Perfetto, questo è quello che mi serviva! Grazie per la pronta risposta! – Riad

3

Si potrebbe anche usare reshape2::dcast.

library(reshape2) 
dcast(product + type~result,data=df, fun.aggregate= length,value.var = 'result') 
## product type fail pass 
## 1  p1 t1 1 5 
## 2  p1 t2 3 3 
## 3  p2 t1 2 4 
## 4  p2 t2 3 3 
+0

Thx così tanto! Questo fa anche il lavoro. – Riad

Problemi correlati