【问题标题】:Table of Interactions - Case with pets and houses互动表 - 宠物和房屋案例
【发布时间】:2013-11-22 08:45:26
【问题描述】:

我有一份房屋清单和一份动物种类清单。

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

注意:这个函数应该适用于任何两个相同长度的向量,无论它们是否包含数字或字符串

【问题讨论】:

    标签: r combinations interaction


    【解决方案1】:

    使用tablecrossprod

    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,您可以直接在print 中禁止打印NA 值:

    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                         
    

    【讨论】:

    • out[lower.tri(out, diag=TRUE)] &lt;- NA中使用diag=TRUE可以节省一行;)
    • @Jilber,真的。我总是忘记diag 中的那个论点。谢谢。
    • 非常优雅的三行解决方案!非常感谢。注意:也可以使用as.table(..) 打印而不使用NA
    • 要获得请求的输出,它将是:print(out[-5,-1], na.print="")
    • 只需添加此答案的稀疏替代方案,以防在制表过程中可以减少任何内存占用:Matrix::crossprod(xtabs(~ houses + animals, sparse = TRUE))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    相关资源
    最近更新 更多