代码之家  ›  专栏  ›  技术社区  ›  Chris Ruehlemann

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

r
  •  1
  • Chris Ruehlemann  · 技术社区  · 5 年前

    我试图为一个简单的任务找到最经济、最优雅的代码:用随机采样值(这里是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 回复  |  直到 5 年前
        1
  •  3
  •   Ronak Shah    5 年前

    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)
    
        2
  •  1
  •   akrun    5 年前

    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"