2017-01-30 3 views
1

Я хочу сгенерировать матрицу nxm. Предположим, что 100x3. Я хочу, чтобы каждая строка суммировалась до 1 (так что два «0» и один «1»).Создайте случайную матрицу в R с m столбцами и n строк, где строки суммируются до 1

sample(c(0,0,1),3) 

даст мне 1 ряд, но есть ли очень быстрый способ генерации всей матрицы без привязки?

Спасибо!

+5

'т (реплицировать (100, образец (с (0,0,1))))' –

ответ

6

Нет петель, нет транспозиции. Просто создайте матрицу нулей и замените одну запись на строку на 1, взяв образцы строк.

m <- matrix(0, 100, 3) 
nr <- nrow(m) 
m[cbind(1:nr, sample(ncol(m), nr, TRUE))] <- 1 

all(rowSums(m) == 1) 
# [1] TRUE 
2
mat <- matrix(runif(300),ncol=3) 
mat[] <- as.numeric(t(apply(mat, 1, function(r) r == max(r)))) 
+0

Я думаю, что вопрос хочет дискретные значения $ 0 $ или $ 1 $ – Henry

+0

Привет, не совсем то, что мне нужно. Каждая строка должна быть равна двум 0 и 1. Это равномерно. – user1357015

+0

Я обновил ответ, см. Снова. – thc

2
t(apply(t(matrix(rep(c(0,0,1),300),nrow = 3)), 1, function(x) sample(x))) 
+0

Не совсем то, что мне нужно. Это помещает все в 3-й столбец. – user1357015

2

Так как вы хотите одного 1 для строки, то проблема может быть пересчитана, чтобы выбрать запись столбца случайным образом, что имеет 1 для каждой строки.

Так что вы можете сделать, как,

m <- 3; n<-100  
rand_v <- floor(runif(n)*3)+1 
mat <- matrix(0,n,m) 
idx <- cbind(1:n,rand_v) 
mat[idx] <- 1 

Надеется, что это помогает.

Смежные вопросы