2013-05-04 14 views
5

Ho 40 paia di uccelli con ogni maschio e femmina nella coppia segnata per il loro colore. Il punteggio del colore è una variabile categoriale con un intervallo di valori compreso tra 1 e 9. Vorrei creare una tabella con il numero di ciascuna combinazione (1/1, 1/2, 1/3, ... 9/7, 9/8, 9/9). Il mio problema è che ci sono alcune combinazioni che non esistono nei miei dati quando provo a creare la tabella (in questi casi vorrei zeri per i valori mancanti). Di seguito sono riportati i dati e il codice di esempio. Sono abbastanza sicuro che la risposta stia nell'usare il comando 'expand.grid()', ad es. vedi questo post, ma non sono sicuro di come implementarlo. Eventuali suggerimenti?Come creare valori mancanti nella tabella in R?

## Dataset pairs of males and females and their colour classes 
Pair_Colours <- structure(list(Male = c(7, 6, 4, 6, 8, 8, 5, 6, 6, 8, 6, 6, 5, 
7, 9, 5, 8, 7, 5, 5, 4, 6, 7, 7, 3, 6, 5, 4, 7, 4, 3, 9, 4, 4, 
4, 4, 9, 6, 6, 6), Female = c(9, 8, 8, 9, 3, 6, 8, 5, 8, 9, 7, 
3, 6, 5, 8, 9, 7, 3, 6, 4, 4, 4, 8, 8, 6, 7, 4, 2, 8, 9, 5, 6, 
8, 8, 4, 4, 5, 9, 7, 8)), .Names = c("Male", "Female"), class = "data.frame", row.names = c(NA, 
40L)) 

Pair_Colours$Male <- as.factor(Pair_Colours$Male) 
Pair_Colours$Female <- as.factor(Pair_Colours$Female) 

## table of pair colour values (colours 1 to 9 - categoricial variable) 
table(Pair_Colours$Male, Pair_Colours$Female) 

## my attempt to create a table with a count of each possible value for pairs 
Colour_Male <- rep(seq(1, 9, by = 1), each = 9) 
Colour_Female <- rep(seq(1, 9, by = 1), times = 9) 
Colour_Count <- as.vector(table(Pair_Colours$Male, Pair_Colours$Female)) # <- the problem occurs here 
Pairs_Colour_Table <- as.data.frame(cbind(cbind(Colour_Male, Colour_Female), Colour_Count)) 

## plot results to visisually look for possible assortative mating by colour 
op<-par(mfrow=c(1,1), oma=c(2,4,0,0), mar=c(4,5,1,2), pty = "s") 
plot(1,1, xlim = c(1, 9), ylim = c(1, 9), type="n", xaxt = "n", yaxt = "n", las=1, bty="n", cex.lab = 1.75, cex.axis = 1.5, main = NULL, xlab = "Male Colour", ylab = "Female Colour", pty = "s") 
axis(1, at = seq(1, 9, by = 1), labels = T, cex.lab = 1.5, cex.axis = 1.5, tick = TRUE, tck = -0.015, lwd = 1.25, lwd.ticks = 1.25) 
axis(2, at = seq(1, 9, by = 1), labels = T, cex.lab = 1.5, cex.axis = 1.5, tick = TRUE, tck = -0.015, lwd = 1.25, lwd.ticks = 1.25, las =2) 
points(Pair_Colours$Male, Pair_Colours$Female, pch = 21, cex = Pairs_Colour_Table$Colour_Count, bg = "darkgray", col = "black", lwd = 1) 

risposta

4

Basta convertire il Pair_Colours ad un factor con tutti i livelli richiesti prima di chiamare table:

# Convert each column to factor with levels 1 to 9 
Pair_Colours[] <- lapply(Pair_Colours, factor, levels=1:9) 
table(Pair_Colours$Male, Pair_Colours$Female) 
#  1 2 3 4 5 6 7 8 9 
# 1 0 0 0 0 0 0 0 0 0 
# 2 0 0 0 0 0 0 0 0 0 
# 3 0 0 0 0 1 1 0 0 0 
# 4 0 1 0 3 0 0 0 3 1 
# 5 0 0 0 2 0 2 0 1 1 
# 6 0 0 1 1 1 0 3 3 2 
# 7 0 0 1 0 1 0 0 3 1 
# 8 0 0 1 0 0 1 1 0 1 
# 9 0 0 0 0 1 1 0 1 0 

È possibile convertire con un as.data.frame se si desidera che il formato di essere "combn1, combn2, frequenza".

+0

+1 Molto bello perché è semplice. Stavo pensando a 'expand.gird'. Ho bisogno di caffè. –

Problemi correlati