【问题标题】:binary matrix in R with specific ones in each columnR中的二进制矩阵,每列中都有特定的矩阵
【发布时间】:2020-03-08 13:31:42
【问题描述】:

如何在 R 中创建一个二进制矩阵,其中每行只有一个 1,但每列中的个数无关紧要?我有这个脚本,但它正在创建一个随机矩阵。我想要的是指定行和列中的个数:

mm <- matrix(0, 6, 5)
apply(mm, c(1, 2), function(x) sample(c(0, 1), 1))

谢谢

【问题讨论】:

标签: r


【解决方案1】:

您可以对位置进行采样而不是对其值进行采样。

set.seed(42)
t(apply(mm, 1, function(x) {x[sample(1:length(x), 1)] <- 1;x}))
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    0    0    0    0
# [2,]    0    0    0    0    1
# [3,]    1    0    0    0    0
# [4,]    1    0    0    0    0
# [5,]    0    1    0    0    0
# [6,]    0    0    0    1    0

或者使用replicate

set.seed(42)
t(replicate(6, sample(c(rep(0, 5 - 1), 1))))
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    0    1    0    0    0
# [2,]    0    0    1    0    0
# [3,]    0    0    1    0    0
# [4,]    0    1    0    0    0
# [5,]    0    0    1    0    0
# [6,]    1    0    0    0    0

你也可以把它包装成一个函数。

genBin <- function(n.row, n.col) t(replicate(n.row, sample(c(rep(0, n.col - 1), 1))))

set.seed(42)
genBin(6, 5)
# # output as one above

【讨论】:

  • 为什么需要transpose?
  • @Edward -42 一次explained 这个井。
【解决方案2】:

这里我们创建一个函数,foo,它创建一个由 0 和 1 组成的随机向量,其中只有一个 1,并且长度与所需矩阵的列数相同。然后,复制此行。

nr <- 6; nc <- 5
foo <- function() sample(c(1, rep(0, nc-1)), nc)
t(replicate(nr, foo()))

编辑:将1 随机分配给每一行,将1 分配给每一列意味着矩阵需要是正方形。一种方法是使用 Matrix 包中的 sparseMatrix 函数。

library(Matrix)
args(sparseMatrix)
# function (i = ep, j = ep, p, x, dims, dimnames, symmetric = FALSE, 
#     triangular = FALSE, index1 = TRUE, giveCsparse = TRUE, check = TRUE, 
#     use.last.ij = FALSE)

ij 指定矩阵的非零条目的位置。所以我们可以使用sample(1:n) 指定这些,其中n 是方阵的行数和列数。

set.seed(1234) # For reproducibility. Omit in reality.
A <- sparseMatrix(i=sample(1:4), j=sample(1:4))
# 4 x 4 sparse Matrix of class "ngCMatrix"          
# [1,] . | . .
# [2,] . . | .
# [3,] | . . .
# [4,] . . . |

这里的| 代表非零值 (TRUE)。

上面的矩阵A可以使用as.matrix转换成二进制矩阵。

as.matrix(A) * 1
     [,1] [,2] [,3] [,4]
[1,]    0    1    0    0
[2,]    0    0    1    0
[3,]    1    0    0    0
[4,]    0    0    0    1

【讨论】:

  • 非常感谢你们,但是如果我希望每列至少有一个,知道该怎么做吗??
  • 然后不要转置结果。还是你的意思是每一行和每一列都有一个?
  • 我的意思是,我希望每列至少有一个 1,每行正好有一个 1!
  • 那么矩阵必须是正方形的。我会更新我的答案...
猜你喜欢
  • 2018-10-20
  • 1970-01-01
  • 2020-10-22
  • 2019-01-27
  • 2017-03-27
  • 1970-01-01
  • 2015-09-23
  • 2013-06-30
  • 1970-01-01
相关资源
最近更新 更多