【问题标题】:How can I sample from a matrix given that each column must have a constraint in R?鉴于每列必须在 R 中具有约束,我如何从矩阵中采样?
【发布时间】:2015-11-20 01:57:47
【问题描述】:

我目前有一个 20 x 3 的矩阵,我试图从中抽取每行一个值。但是,约束是每列不能有超过 5 个选定值。这是我的矩阵示例:

  > matrix(1:80, 20, 4, byrow=T)
      [,1] [,2] [,3] [,4]
 [1,]    1    2    3    4
 [2,]    5    6    7    8
 [3,]    9   10   11   12
 [4,]   13   14   15   16
 [5,]   17   18   19   20
 [6,]   21   22   23   24
 [7,]   25   26   27   28
 [8,]   29   30   31   32
 [9,]   33   34   35   36
[10,]   37   38   39   40
[11,]   41   42   43   44
[12,]   45   46   47   48
[13,]   49   50   51   52
[14,]   53   54   55   56
[15,]   57   58   59   60
[16,]   61   62   63   64
[17,]   65   66   67   68
[18,]   69   70   71   72
[19,]   73   74   75   76
[20,]   77   78   79   80

据此,我想获得一个矩阵,我在其中每行随机采样一个条目,但约束条件是每列不得超过 5 个条目。我想得到的一个样本是:

 > MM
      [,1] [,2] [,3] [,4]
 [1,]    1    0    0    0
 [2,]    0    0    7    0
 [3,]    0    0   11    0
 [4,]    0    0   15    0
 [5,]    0   18    0    0
 [6,]   21    0    0    0
 [7,]    0    0   27    0
 [8,]    0    0    0   32
 [9,]    0    0   35    0
[10,]    0    0    0   40
[11,]   41    0    0    0
[12,]   45    0    0    0
[13,]   49    0    0    0
[14,]    0   54    0    0
[15,]    0    0    0   60
[16,]    0    0    0   64
[17,]    0   66    0    0
[18,]    0   70    0    0
[19,]    0   74    0    0
[20,]    0    0    0   80

非零值是我选择的值。我希望以这种最终格式获得它。有没有人知道如何做到这一点,以便我尽可能独立地采样?谢谢!

【问题讨论】:

  • 如果您的任何原始值为零,这将很快变得混乱。也许你应该用NA 填充未选择的值。

标签: r


【解决方案1】:

假设如果'm1'是输入矩阵,我们创建一个与'm1'('m2')具有相同维度的0矩阵。我们sample 复制了 5 (5*4 = 20) 后的列序列,cbind 使用行序列创建行/列索引。使用它来将 'm2' 中的值替换为 'm1'。

 m2 <- matrix(0, ncol=ncol(m1), nrow=nrow(m1))
 i1 <-cbind(1:nrow(m1),sample(rep(1:ncol(m1), each=5)))
 m2[i1] <- m1[i1]
 colSums(!!m2)
 #[1] 5 5 5 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2013-07-25
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多