我想扩展这个post的解决方案,其中@AnandaMahto为我的问题提供了一个非常优雅的解决方案。
对于这个新的功能,我想如果在同一个房子里有几倍相同的物种,它只会计算一个观察结果。一个有两个cats和一个rat的房子不会在cat和rat之间创建两个观测结果,而只创建一个(如下所示)
在这个例子中,第4宫有两个rats,正如前面所说的,我不想考虑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发布于 2013-11-13 17:30:51
在使用> 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将处理不打印NA值的问题,因此可以这样做:
out <- as.table(out[-nrow(out), -1])
out
# animals
# animals dog rat spider
# cat 1 2 1
# dog 0 0
# rat 1https://stackoverflow.com/questions/19960367
复制相似问题