我想扩展这个post的解决方案,其中@AnandaMahto为我的问题提供了一个非常优雅的解决方案。
对于这个新功能,我希望如果在同一个房子里有多次相同的物种,那么它只计算一次观察。一个有两个cats
和一个rat
的房子不能在cat
和rat
之间创建两个观察值,但只有一个(如下所示)
在此示例中,门牌号码4中有两个rats
。如上所述,我不想考虑rat
和cat
之间以及{{1}之间的两个观察}和spider
但rat
和rat
之间只有一次观察,cat
和spider
之间只有一次观察
rat
@ AnandaMahto的解决方案将返回:
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')
但我想得到这个:
dog rat spider
cat 1 3 1
dog 0 0
rat 2
答案 0 :(得分:2)
在使用> 0
之前,将table
中的所有值crossprod
等于“1”:
(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
会照不打印{{1从上面继续,你可以这样做:
NA