Linked Questions

Popular Questions

What's the most economical way to fill a matrix with random values?

Asked by At

I'm trying to find the most economical and elegant code for a simple task: fill an empty matrix with randomly sampled values (here, A, B, or C). For illustration, let's take this matrix:

x <- matrix(NA, nrow=8, ncol=4)
     [,1] [,2] [,3] [,4]
[1,]   NA   NA   NA   NA
[2,]   NA   NA   NA   NA
[3,]   NA   NA   NA   NA
[4,]   NA   NA   NA   NA
[5,]   NA   NA   NA   NA
[6,]   NA   NA   NA   NA
[7,]   NA   NA   NA   NA
[8,]   NA   NA   NA   NA

To fill it I've used two codes so far, each successfully doing the job. The first uses sapply:

x[] <- sapply(x, function(i) sample(LETTERS[1:3], 1, replace = F))
x
     [,1] [,2] [,3] [,4]
[1,] "C"  "A"  "B"  "C" 
[2,] "B"  "B"  "B"  "B" 
[3,] "A"  "B"  "B"  "B" 
[4,] "B"  "C"  "A"  "C" 
[5,] "B"  "A"  "C"  "A" 
[6,] "A"  "B"  "C"  "A" 
[7,] "A"  "C"  "C"  "A" 
[8,] "C"  "B"  "B"  "C"

while the second is a forloop:

for(i in 1:nrow(x)){
    x[i,] <- sample(LETTERS[1:3], 4, replace = T)
   }
x
    [,1] [,2] [,3] [,4]
[1,] "C"  "A"  "C"  "C" 
[2,] "C"  "A"  "B"  "B" 
[3,] "C"  "C"  "A"  "B" 
[4,] "C"  "C"  "A"  "C" 
[5,] "A"  "C"  "C"  "C" 
[6,] "B"  "C"  "A"  "A" 
[7,] "C"  "C"  "B"  "A" 
[8,] "B"  "C"  "B"  "C"

I like neither of them as they both look bulky. Is there a better way to get the expected result, that is, is there a shorter and/or more elegant way?

Related Questions