medsocgrad
medsocgrad

Reputation: 31

Replacing Values in Randomly Generated Matrix with Additional Random Numbers

I'm working with a matrix where I need to replace values coded as 1 with new randomly generated numbers

The starting point is a matrix like this

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
}

In the resulting p matrix, on each row I need the value of 1 to be replaced with a randomly generated integer bound between 1 and 25, where the numbers cannot repeat.

For example, on the first row of the matrix, there should be 6 randomly drawn numbers between 1 and 25, where none of the numbers are repeated, and 19 NA columns. On row two, there should be 12 randomly drawn numbers between 1 and 25 with no repeats and 13 NA columns.

Any help is greatly appreciated.

Upvotes: 3

Views: 161

Answers (3)

Khaynes
Khaynes

Reputation: 1986

You can simply multiply your matrix by another matrix of random numbers. NA's will remain as NA.

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

Or if the dimensions change:

p*matrix(sample(1:25), nrow(p), ncol(p))

Upvotes: 2

hmhensen
hmhensen

Reputation: 3195

Assuming you've created your initial matrix, here's one way to do it.

apply(t(p), 1, function(x) ifelse(x == 1, sample(1:25, sum(x[x == 1], na.rm = T), replace = F)))

Upvotes: 0

George
George

Reputation: 4257

Where you have:

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

You're assigning to a range of inputs. So instead of assigning 1, you need to assign an appropriately sized vector with the elements you want. This can be generated with: 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)
}

Upvotes: 0

Related Questions