двоичная матрица в R с определенными c единицами в каждом столбце - PullRequest
0 голосов
/ 08 марта 2020

Как я могу создать двоичную матрицу в R, где в каждой строке есть только одна единица, но не имеет значения, сколько единиц в каждом столбце? У меня есть этот скрипт, но он создает случайную матрицу. Я хочу указать количество единиц в строках и столбцах:

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

Спасибо

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Здесь мы создаем функцию foo, которая создает случайный вектор из 0 и 1 с только одной 1 и той же длиной, что и число столбцов требуемой матрицы. Затем скопируйте эти nrows.

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

Edit : случайное присвоение одного 1 каждой строке и одного 1 каждому столбцу означает, что матрица должна быть квадрат . И один из способов сделать это - использовать функцию sparseMatrix из пакета Matrix.

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)

i и j указывают расположение ненулевых элементов матрицы. Таким образом, мы можем указать их, используя 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,] . . . |

Здесь | представляют ненулевые значения (ИСТИНА).

Приведенную выше матрицу 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
0 голосов
/ 08 марта 2020

Вы можете сэмплировать позиции, а не их значения.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...