【问题标题】:R: How can I store various random numbers generated by a loop in a matrix?R:如何将循环生成的各种随机数存储在矩阵中?
【发布时间】:2020-08-04 15:39:22
【问题描述】:

我想生成 10 乘以 20 的 1 到 100 之间的随机数。因此,最终矩阵总共应包含 200 个数字。 这是我的方式,我是如何尝试解决的:

x <- 10
N <- 20
A <- matrix()

for (i in 1:x) {
  
  A[i] <- sample(1:100, N, FALSE)
  
}

A

结果是,A 似乎有问题。

【问题讨论】:

    标签: r matrix random storage sampling


    【解决方案1】:

    索引时缺少逗号。我是对的,同一个矩阵的每一行都应该用随机数填充?

    x <- 10
    N <- 20
    A <- matrix(data = NA, nrow = x, ncol = N)
    
    for (i in 1:x) {
      
      A[i,] <- sample(1:100, N, TRUE)
      
    }
    
    A
    #>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
    #>  [1,]   13   20   13   20   13   18   17    2   18     8     5    17    18
    #>  [2,]    1    7   18   15    3   20    4    4   13    10     7     6    15
    #>  [3,]    7    3    1   16   12   19   16   16   16    17    15    14    19
    #>  [4,]   15   19    4    6    4    5    4    5    8    12    20    14    17
    #>  [5,]   14    4    9    7   18   10   12   12   12    20    14    10     9
    #>  [6,]   19    4   19    7    6    1   17    6    8     3     4     1     1
    #>  [7,]   10   19    8    7    8   16   10    9    6     5     1    12     3
    #>  [8,]   15    9    9   11    1   15   10   14   19     8     7    18    15
    #>  [9,]   19    3   19    8    8   18    7    1   18    15    18     1    17
    #> [10,]   19    4   20    7    6   12   12   14   15    13    14    16     7
    #>       [,14] [,15] [,16] [,17] [,18] [,19] [,20]
    #>  [1,]    15     5     8     4     5     2     1
    #>  [2,]     5    12    19    11    13    18    11
    #>  [3,]    10    14    15     7     8    11    13
    #>  [4,]     2     4     2    11    12     6     2
    #>  [5,]    15    14    13    11    10     5    14
    #>  [6,]    14    16     6    12     6     2    13
    #>  [7,]     5     4    15     2     1    14     9
    #>  [8,]     8    10     5     2     2    14    13
    #>  [9,]    19    14     1    16     7    16    15
    #> [10,]    18     4    20     4    12     3    11
    

    如果您不是在寻找没有替换的采样,最快的方法应该是直接用采样数据填充矩阵命令:

    matrix(sample(1:100, 200, TRUE), 10, 20)
    #>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
    #>  [1,]  100   27   99   82   15   55   27   35   77    89    16    45    10
    #>  [2,]    3   96   80   87   90   51   10    4   32    40    37    29    49
    #>  [3,]   99   97   30   32   34   27   56   12   62    36    57    64    25
    #>  [4,]   23   29    4   60   52   71  100   26   18    19    97     9    15
    #>  [5,]   77   76   63   94   27   33   68    6   42    46   100    22    43
    #>  [6,]   43   84   89   90   22   90   44   59    8    71    79    14     2
    #>  [7,]   97   40   39    3   91   26   26   32   33    53    75     1    65
    #>  [8,]   77   91   45   36   44   92   37   22   46    73    66   100    23
    #>  [9,]   44   85   42   98   80   91   32   60   42    85    52    22    11
    #> [10,]    6    4   51   96   82   13   72    8    3    61    50    92    91
    #>       [,14] [,15] [,16] [,17] [,18] [,19] [,20]
    #>  [1,]    90    17    13    52    61    75    65
    #>  [2,]    53    75     3    55    82    69    73
    #>  [3,]    21    46    60    43    76    72    58
    #>  [4,]    33    26    92    92    19    97    62
    #>  [5,]    15    92    36    63    44    35    59
    #>  [6,]     9    66    17    35    50    18    13
    #>  [7,]    36    19    92    94    77    55    56
    #>  [8,]     9    54    86    58    69    68    11
    #>  [9,]    25    65    61    97    45    94    86
    #> [10,]    52    42    18     4    94    49    58
    

    reprex package (v0.3.0) 于 2020 年 8 月 4 日创建

    【讨论】:

    • 即将发布类似的答案,并评论说 for 循环不是最佳策略。由于问题是关于如何将这些值存储在matrix 中,我认为有空间指出同样的任务可以通过matrix(round(runif(200, 1, 100)), nrow = 10) 更有效地完成。也许您可以将此添加到您的答案中?
    【解决方案2】:

    除了上面的答案之外,查看replicate 包装器以获得不需要循环的更简洁的解决方案。它会给你基本相同的结果,尽管 20 个随机样本中的 10 个将沿列而不是沿行运行(这相当于早期解决方案的转置)。

    set.seed(100) # to make the results reproducible
    
    x <- 10
    N <- 20
    
    replicate(x, sample(1:100, N, FALSE))
    
           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
     [1,]   74    2   41   55   42   19   50   87   20    46
     [2,]   89   51  100   47   76   95   12   30   64    89
     [3,]   78   68   24   68   37   23   60   82   79    64
     [4,]   23   98   43   12   26   76   45   97   15    19
     [5,]   86   52    7   51   24   26   37   71  100    11
     [6,]   70   48   63   16   12    5   68   74   50    76
     [7,]    4   32   65   56    9   78   73   49   47    20
     [8,]   55   85    9   22   55   40   26    2   55    74
     [9,]   95   91   20   82   75   81   27   11   18   100
    [10,]    7   39   14   53   63   97   31   47   89    82
    [11,]   91   16   78    3   35   64   46    1   53    28
    [12,]   93   75   88    5   58   54   71   95   84    16
    [13,]   43   66    3   44   97   42   21   32   11    69
    [14,]   82   70   36   85   48    3   39   73   77     7
    [15,]   61   45   27   28   80   80   65   13   22    81
    [16,]   12   30   46   52   98   38   16   62   52    56
    [17,]   51   93   59   25   18   43   82   92   39    37
    [18,]   72   29   85   42   72   83    8   58   31    72
    [19,]   18   31   69   15   83    4   10   14   78    93
    [20,]   25   54   47   57   66   74   69   42   76     5
    

    如果您希望每行有 10 个样本,请使用 t 函数:

    set.seed(100)
    t(replicate(x, sample(1:100, N, FALSE)))
    
          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
     [1,]   74   89   78   23   86   70    4   55   95     7    91    93    43    82    61    12    51    72    18    25
     [2,]    2   51   68   98   52   48   32   85   91    39    16    75    66    70    45    30    93    29    31    54
     [3,]   41  100   24   43    7   63   65    9   20    14    78    88     3    36    27    46    59    85    69    47
     [4,]   55   47   68   12   51   16   56   22   82    53     3     5    44    85    28    52    25    42    15    57
     [5,]   42   76   37   26   24   12    9   55   75    63    35    58    97    48    80    98    18    72    83    66
     [6,]   19   95   23   76   26    5   78   40   81    97    64    54    42     3    80    38    43    83     4    74
     [7,]   50   12   60   45   37   68   73   26   27    31    46    71    21    39    65    16    82     8    10    69
     [8,]   87   30   82   97   71   74   49    2   11    47     1    95    32    73    13    62    92    58    14    42
     [9,]   20   64   79   15  100   50   47   55   18    89    53    84    11    77    22    52    39    31    78    76
    [10,]   46   89   64   19   11   76   20   74  100    82    28    16    69     7    81    56    37    72    93     5
    

    【讨论】: