【问题标题】:Creating Binary Matrix in R在 R 中创建二进制矩阵
【发布时间】:2013-07-10 19:53:26
【问题描述】:

我有 3 个训练集,包含 5 个不同的事件: list(c('e1','e3','e4'),c('e2','e4'),c('e1','e3','e5'))

我不知道我的列表中有多少活动。所以我也需要计算它们。这里我以 e1 到 e5 事件为例。可能有 m 个事件,我还需要找到 m 个。怎么找米? 一般来说,如何在 R 中创建 m×n 二进制矩阵,其中 m-事件总数,n-训练集数? 事件 ID 可能是随机的,不一定是 'eN' 类型,如 'MX050331'、'IIF02002' 等。

【问题讨论】:

    标签: r matrix


    【解决方案1】:
    # per the OP's second edit
    # now assumes there are no events that haven't been observed at least once
    tr <- list(c('e1','e3','e4'),c('e2','e4'),c('e1','e3','e5'))
    e <- unique(unlist(tr))
    sapply(tr, function(x) e %in% x)
    

    【讨论】:

    • 这一次,我不必转置sapply的结果!
    • 或者你可能会...
    • 如果lapply 返回所有相同长度的向量,sapply 将它们视为 column 向量,因此结果是一个矩阵,其中每个个体的 nrows=length向量,ncols=向量的数量。在这种情况下,OP 想要一个 5x3 矩阵,所以它适合。
    • @Hong: 如果事件有一些随机 ID 而不是 'eN' 那么如何处理?
    • @anu 与其讨论任意复杂的问题,也许您应该将您对事件的了解放入您的问题中。
    【解决方案2】:

    大概是这样的:

    x <- list(c('e1','e3','e4'),
              c('e2','e4'),
              c('e1','e3','e5'))
    t(sapply(x, function(y) {
      table(factor(y, levels = c("e1", "e2", "e3", "e4", "e5")))
    }))
    #      e1 e2 e3 e4 e5
    # [1,]  1  0  1  1  0
    # [2,]  0  1  0  1  0
    # [3,]  1  0  1  0  1
    

    显然,如果您不想转置 t,可以删除它。

    如果事件的数量和名称未知,可以修改函数如下:

    t(sapply(x, function(y) {
      myLevs <- unique(unlist(x))
      table(factor(y, levels = myLevs[order(myLevs)]))
    }))
    

    【讨论】:

      猜你喜欢
      • 2013-06-30
      • 2017-03-27
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 2020-10-22
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      相关资源
      最近更新 更多