0

我想扩展这篇文章的解决方案,@AnandaMahto 为我的问题提供了一个非常优雅的解决方案。

对于这个新功能,我希望如果同一个房子里有多次相同的物种,它只会计算一次观察。一所房子有两个cats和一个rat不会在和之间创建两个观察值catrat只有一个(如下图所示)

在这个例子中,4 号房子有两个rats。如前所述,我不想考虑ratandcat和 between 之间的两个观察值spiderrat而只考虑 and 之间的一个观察值rat和and之间cat的一个观察值spiderrat

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
4

1 回答 1

2

在使用之前使所有值都> 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
于 2013-11-13T17:30:51.463 回答