Таблица взаимодействий - кейс с домашними животными и домами 2
Я хочу расширить решение этого поста, где @AnandaMahto дала очень элегантное решение моей проблемы.
Для этой новой функции мне бы хотелось, чтобы, если в одном и том же доме было несколько раз одного и того же вида, будет учитываться только одно наблюдение. Один дом с двумя cats
и один rat
не создает два наблюдения между cat
а также rat
но только один (как показано ниже)
В этом примере есть два rats
в доме № 4. Как уже говорилось, я не хочу рассматривать два наблюдения между rat
а также cat
и между spider
а также rat
но только одно наблюдение между rat
а также cat
и одно наблюдение между spider
а также rat
houses = c(1,1,2,3,4,4,4,4,5,6,5)
animals = c('cat','dog','cat','dog','rat', 'cat', 'spider', 'rat', 'cat', 'cat', 'rat')
Решение @ AnandaMahto вернет это:
dog rat spider
cat 1 3 1
dog 0 0
rat 2
Но я хотел бы получить это:
dog rat spider
cat 1 2 1
dog 0 0
rat 1
1 ответ
Сделать все значения > 0
от table
равен "1" перед использованием crossprod
:
(table(houses, animals) > 0) *1
# animals
# houses cat dog rat spider
# 1 1 1 0 0
# 2 1 0 0 0
# 3 0 1 0 0
# 4 1 0 1 1
# 5 1 0 1 0
# 6 1 0 0 0
out <- crossprod((table(houses, animals) > 0) *1)
out[lower.tri(out, diag=TRUE)] <- NA
as.table(out)
# animals
# animals cat dog rat spider
# cat 1 2 1
# dog 0 0
# rat 1
# spider
Чтобы получить желаемый результат, так как мы знаем, что первый столбец и последний ряд будут пустыми, и так как вы уже сами выяснили, что as.table
позаботится о том, чтобы не печатать NA
Значения, продолжающиеся сверху, можно сделать:
out <- as.table(out[-nrow(out), -1])
out
# animals
# animals dog rat spider
# cat 1 2 1
# dog 0 0
# rat 1