Замена значений в случайно сгенерированной матрице дополнительными случайными числами - PullRequest
0 голосов
/ 26 января 2019

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

Исходная точка - это такая матрица

set.seed(38921)
p <- matrix(nrow = 10, ncol = 25)
for(i in 1:10){
  p[i, seq(1, floor(runif(1, min = 1, max = 25)), 1)] = 1
}

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

Например, в первой строке матрицы естьдолжно быть 6 случайно выбранных чисел от 1 до 25, где ни одно из чисел не повторяется, и 19 столбцов NA.Во второй строке должно быть 12 случайным образом нарисованных чисел от 1 до 25 без повторов и 13 столбцов NA.

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 26 января 2019

Предполагая, что вы создали свою исходную матрицу, вот один из способов сделать это.

apply(t(p), 1, function(x) ifelse(x == 1, sample(1:25, sum(x[x == 1], na.rm = T), replace = F)))
0 голосов
/ 26 января 2019

Вы можете просто умножить свою матрицу на другую матрицу случайных чисел.NA останутся как NA.

p*matrix(sample(1:25), 10, 25)

Или, если размеры изменятся:

p*matrix(sample(1:25), nrow(p), ncol(p))
0 голосов
/ 26 января 2019

Где у вас есть:

p[i, seq(1, floor(runif(1, min = 1, max = 25)), 1)] = 1

Вы назначаете диапазон входов. Поэтому вместо того, чтобы назначать 1, вам нужно назначить вектор соответствующего размера с элементами, которые вы хотите. Это может быть сгенерировано с помощью: sample(1:25, desiredLength, replace=F)

set.seed(38921)
p <- matrix(nrow = 10, ncol = 25)
for(i in 1:10){
  n = floor(runif(1, min = 1, max = 25))
  p[i, seq(1, n, 1)] = sample(1:25, n, replace=F)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...