Tabela de Interações – Caso com animais de estimação e casas

Eu tenho uma lista de casas e uma lista de espécies de animais.

houses = c(1,1,2,3,4,4,4,4,5,6,5) animals = c('cat','dog','cat','dog','rat', 'cat', 'spider', 'snake', 'cat', 'cat', 'rat') 

Eu estou tentando criar uma function que retorna uma tabela triangular superior que indica para cada animal de estimação, o número de vezes que foi observado para viver na mesma casa que as outras espécies de animais. Isso faz sentido?

Para o exemplo acima, a tabela deve ficar assim (espere que não haja engano!):

  dog rat spider snake cat 1 2 1 1 dog 0 0 0 rat 1 1 spider 1 

Nota: Esta function deve funcionar para quaisquer dois vetores de mesmo tamanho, seja qual for, se eles contiverem números ou string

Use table e crossprod :

 out <- crossprod(table(houses, animals)) out[lower.tri(out, diag=TRUE)] <- NA out # animals # animals cat dog rat snake spider # cat NA 1 2 1 1 # dog NA NA 0 0 0 # rat NA NA NA 1 1 # snake NA NA NA NA 1 # spider NA NA NA NA NA 

Como a saída é uma matrix você pode suprimir a impressão dos valores de NA diretamente na print :

 print(out,na.print="") # animals # animals cat dog rat snake spider # cat 1 2 1 1 # dog 0 0 0 # rat 1 1 # snake 1 # spider