Come creare tabelle di contingenza (Tavole) in R per un sottoinsieme di colonne con i dati categorica?

StackOverflow https://stackoverflow.com/questions/3518010

  •  29-09-2019
  •  | 
  •  

Domanda

Ho una tabella cui colpo di testa si presenta così (ho semplificato esso):

id, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10

dove ogni riga, tranne id, è una variabile categorica. Il nome di Let categorie A, B, C, D, E.

Vorrei creare una tabella di contingenza per alcuni delle colonne, come di seguito (per brevità, non ho messo i numeri dei campioni nelle celle). Ottenere la colonna / riga del totale sarebbe fantastico, ma non obbligatorio, posso calcolare da solo in seguito.

      a1  a2  a3  a4 Total
    ----------------------
    A|
    B|
    C|
    D|
    E|
Total|

Quindi, la domanda è come creare un campo incrociato in base a più colonne in R? Gli esempi che ho visto con la tabella () e xtabs () utilizzano solo una colonna. Nel mio caso, le colonne sono adiacenti, così un campo incrociato sarebbe riassumere colonne a1..a4, un'altra a5..a7 e così via. Mi auguro che ci sia un modo elegante per fare questo.

Sono un programmatore, ma un novizio in R.

Grazie in anticipo.

È stato utile?

Soluzione

I tuoi dati è scarsamente formattato per questo scopo. Ecco un approccio per ridisegnare in modo appropriato i dati con il pacchetto reshape.

library(reshape)
data.m <- melt(data, id = "id")

Per calcolare un tavolo per tutti i livelli, con margini, è possibile utilizzare

cast(data.m, value ~ variable, margins = T)

Per un sottoinsieme, prende il relativo sottoinsieme di data.m.

Altri suggerimenti

Ecco come farlo utilizzando i comandi R di base. Non è necessario il ciclo for se ogni colonna ha gli stessi livelli di fattore, ma il ciclo sarebbe un buon fail-safe.

> set.seed(21)
> df <- data.frame(
+   id=1:20,
+   a1=sample(letters[1:4],20,TRUE),
+   a2=sample(letters[1:5],20,TRUE),
+   a3=sample(letters[2:5],20,TRUE),
+   a4=sample(letters[1:5],20,TRUE),
+   a5=sample(letters[1:5],20,TRUE),
+   a6=sample(letters[1:5],20,TRUE) )
> 
> for(i in 2:NCOL(df)) {
+   levels(df[,i]) <- list(a="a",b="b",c="c",d="d",e="e")
+ }
> 
> addmargins(mapply(table,df[,-1]))
    a1 a2 a3 a4 a5 a6 Sum
a    6  2  0  2  5  3  18
b    3  3  7  2  1  3  19
c    5  3  1  6  5  3  23
d    6  8  6  1  5  3  29
e    0  4  6  9  4  8  31
Sum 20 20 20 20 20 20 120
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top