Таблица взаимодействий - случай с домашними животными и домами

У меня есть список домов и список видов животных.

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

Я пытаюсь создать функцию, которая возвращает верхнюю треугольную таблицу, которая указывает для каждого питомца, количество раз, которое, как было замечено, живет в том же доме, что и другие виды животных. Имеет ли смысл?

В приведенном выше примере таблица должна выглядеть так (надеюсь, что нет ошибки!):

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

Примечание. Эта функция должна работать для любых двух векторов одинаковой длины, независимо от того, содержат ли они числа или строку

Ответ 1

Используйте table и 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

Поскольку выходной сигнал matrix, вы можете подавить печать значений 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