hard worker
hard worker

Reputation: 191

build matrix in a for loop automatically in R

Suppose I have a code like this

probv=c(0.5,0.1,0.2,0.3)
N=c(1,2,3,4)

g1=matrix(rbinom(n = 10, size = N[1], prob = probv[1]), nrow=5)
g2=matrix(rbinom(n = 10, size = N[2], prob = probv[2]), nrow=5)
g3=matrix(rbinom(n = 10, size = N[3], prob = probv[3]), nrow=5)
g4=matrix(rbinom(n = 10, size = N[4], prob = probv[4]), nrow=5)

I want to use a for loop for i in (1:J) {......} J=4 in this case use one line function to return the same output like this, I want to know how I create a matrix g_ in the loop which is also benefit for me when I increase the length of my vector into 5,6,7...... for example N=c(1,2,3,4,5) probv=c(0.5,0.1,0.2,0.3,0.5) I do not change my code to create another matrix called g5.The code can create it and I just need to change my input to achieve my goal

Thanks Akrun

what is my N is a three dimensional array, I want to map the last dimension of it? How to change in the map method?

probv=c(0.5,0.1,0.2,0.3)
N=array(1:24,c(3,2,4))

g1=matrix(rbinom(n = 10, size = N[,,1], prob = probv[1]), nrow=5)
g2=matrix(rbinom(n = 10, size = N[,,2], prob = probv[2]), nrow=5)
g3=matrix(rbinom(n = 10, size = N[,,3], prob = probv[3]), nrow=5)
g4=matrix(rbinom(n = 10, size = N[,,4], prob = probv[4]), nrow=5)

Upvotes: 1

Views: 157

Answers (1)

akrun
akrun

Reputation: 886938

We can use Map to loop over the 'N' and 'probv' vector, get the corresponding values into rbinom and create a matrix. It returns a list of matrices

lst1 <- Map(function(x, y) matrix(rbinom(n = 10,
        size = x, prob = y), nrow = 5), N, probv)

Or using for loop

lst2 <- vector('list', length(N))
for(i in seq_along(N)) {
     lst2[[i]] <- matrix(rbinom(n = 10, size = N[i], prob = probv[i]), nrow = 5)
   }
 names(lst2) <- paste0("g", seq_along(lst2))

For the updated question to extract from an array

mnLength <- min(length(probv), dim(N)[3])
lst2 <- vector('list', mnLength)
for(i in seq_len(mnLength)) {
     lst2[[i]] <- matrix(rbinom(n = 10, size = N[,,i], prob = probv[i]), nrow = 5)
   }

names(lst2) <- paste0("g", seq_along(lst2))
lst2$g1
lst2$g2

Upvotes: 1

Related Questions