Tabla de interacciones – Caso con mascotas y casas

Tengo una lista de casas y una lista de especies de animales.

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') 

Intento crear una función que devuelva una tabla triangular superior que indique para cada mascota el número de veces que se observó que vivía en la misma casa que las otras especies animales. ¿Tiene sentido?

Para el ejemplo anterior, la tabla debe verse así (¡espero que no haya ningún error!):

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

Nota: Esta función debería funcionar para dos vectores de la misma longitud, cualquiera que sea si contienen números o cadenas.

Use table y 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 la salida es una matrix , puede suprimir la impresión de los valores NA directamente en la 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