如果每列必须在R中有约束,我如何从矩阵中进行采样?

时间:2015-11-19 17:53:57

标签: r

我目前有一个20乘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

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

1 个答案:

答案 0 :(得分:1)

假设'm1'是输入矩阵,我们创建一个0的矩阵,其尺寸与'm1'('m2')相同。我们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