在R中创建二进制矩阵

时间:2013-07-10 11:20:56

标签: r matrix

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

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

2 个答案:

答案 0 :(得分:5)

# 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)

答案 1 :(得分:3)

也许是这样的:

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)]))
}))