Какой самый экономичный способ заполнить матрицу случайными значениями? - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь найти наиболее экономичный и элегантный код для простой задачи: заполнить пустую матрицу случайно выбранными значениями (здесь, A, B или C).Для иллюстрации возьмем эту матрицу:

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

Чтобы заполнить ее, я использовал два кода, каждый из которых успешно выполняет свою работу.Первый использует 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"

, а второй - цикл for:

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"

Мне не нравится ни один из них, поскольку они оба выглядят громоздкими.Есть ли лучший способ получить ожидаемый результат, то есть есть более короткий и / или более элегантный способ?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Мы можем использовать replace без изменения оригинала matrix

replace(x, TRUE,  sample(LETTERS, length(x), replace = TRUE))
#     [,1] [,2] [,3] [,4]
#[1,] "B"  "O"  "S"  "D" 
#[2,] "N"  "C"  "Q"  "Z" 
#[3,] "X"  "X"  "Z"  "X" 
#[4,] "O"  "G"  "R"  "R" 
#[5,] "L"  "B"  "S"  "U" 
#[6,] "Y"  "I"  "O"  "A" 
#[7,] "L"  "Y"  "P"  "M" 
#[8,] "R"  "X"  "H"  "T" 
0 голосов
/ 07 февраля 2019

Как насчет его назначения напрямую?

x[] <- sample(LETTERS, length(x), replace = TRUE)

x
#    [,1] [,2] [,3] [,4]
#[1,] "A"  "H"  "V"  "A" 
#[2,] "X"  "M"  "Y"  "O" 
#[3,] "A"  "W"  "N"  "I" 
#[4,] "H"  "Y"  "Y"  "C" 
#[5,] "W"  "N"  "O"  "P" 
#[6,] "Y"  "H"  "P"  "J" 
#[7,] "I"  "Y"  "N"  "H" 
#[8,] "S"  "F"  "Z"  "I" 

Если вы хотите включить только первые три LETTERS, это будет работать

x[] <- sample(LETTERS[1:3], length(x), replace = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...