用随机值填充矩阵的最经济方法是什么?

时间:2019-02-07 14:04:30

标签: r

我正在尝试找到最经济,最优雅的代码来完成一项简单的任务:用随机采样的值(此处为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 :(得分:3)

如何直接分配?

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)

答案 1 :(得分:1)

我们可以使用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"