我目前有一个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
非零值是我选择的值。我希望以这种最终格式得到它。有人会有任何想法如何做到这一点,以便我尽可能独立地采样?谢谢!
答案 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