在R中计算/转换二进制矩阵/向量的数字向量

3

如何自动构建一个矩阵,将 vector <- c(1,2,3) 的排列转换成一种二进制格式?就像这样:

x <- matrix(c(1,1,0,0,0,1,0,1,1,0,1,1,0,0,0,1,1,1), ncol = 3)
rownames(x) <- c("1", "1,2", "2", "3", "2,3", "1,2,3")
colnames(x) <- c("1", "2", "3")

x
      1 2 3
1     1 0 0
1,2   1 1 0
2     0 1 0
3     0 0 1
2,3   0 1 1
1,2,3 1 1 1

虽然我想拥有的不是3个值,而是7个值。


我想示例中应该包括1,3以及1,0,1,对吗? - Julius Vainora
是的,抱歉,我忘了。我们可以假设它已经包含在内了! - Ezra
3个回答

1
一种方法是:
x <- c(2, 4, 5)
combs <- sapply(1:length(x), combn, x = x)
M <- do.call(rbind, sapply(combs, function(u)
  t(apply(u, 2, function(v) 1 * x %in% v))))
dimnames(M) <- list(unlist(sapply(combs, apply, 2, paste, collapse = ",")), x)
M
#       2 4 5
# 2     1 0 0
# 4     0 1 0
# 5     0 0 1
# 2,4   1 1 0
# 2,5   1 0 1
# 4,5   0 1 1
# 2,4,5 1 1 1

1
这里有一个函数,可以将任何向量转换为适当的二进制矩阵。
get_binary <- function(x){
  v1 <- unlist(sapply(seq_along(x), function(i) combn(x, i, toString)))
  mat <- t(sapply(v1, function(i)sapply(x, function(j) as.integer(grepl(j, i)))))
  colnames(mat) <- x
  return(mat)
}

get_binary(c(2, 8, 9))

which gives,

        2 8 9
2       1 0 0
8       0 1 0
9       0 0 1
2, 8    1 1 0
2, 9    1 0 1
8, 9    0 1 1
2, 8, 9 1 1 1

1
这是一行非常快的代码:

vector <- c(1,2,3)
library(RcppAlgos)
toBinary <- function(v) permuteGeneral(0:1, length(v), TRUE)[-1,]

toBinary(vector)
     [,1] [,2] [,3]
[1,]    0    0    1
[2,]    0    1    0
[3,]    0    1    1
[4,]    1    0    0
[5,]    1    0    1
[6,]    1    1    0
[7,]    1    1    1
[-1, ]是为了删除所有零行。这一行将代表空集在幂集中。事实上,您所要求的是从向量的幂集(当然不包括空集)到二进制矩阵的映射。
如果您真的希望row.names是实际排列,您可以使用rje包中的powerSet函数。观察:
library(rje)
nameTest <- toBinary(vector)
row.names(nameTest) <- lapply(powerSet(rev(vector))[-1], sort)

nameTest
           [,1] [,2] [,3]
3             0    0    1
2             0    1    0
c(2, 3)       0    1    1
1             1    0    0
c(1, 3)       1    0    1
c(1, 2)       1    1    0
c(1, 2, 3)    1    1    1

* 免责声明:我是 RcppAlgos 的作者。


这是完美的,最终正是我所寻找的!谢谢。 - Ezra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接