任何人都可以帮助我。
我正在尝试搜索矩阵的列以获得一定的总和(假设为120)。我无法弄清楚它是否有效。一旦总和达到120,它应该在一列内停止计数。问题似乎是我的公式中的第二个i(a [i + 0:i,j])将整个事情搞砸了。
a <- matrix(1:100, nrow=10)
a
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 11 21 31 41 51 61 71 81 91
[2,] 2 12 22 32 42 52 62 72 82 92
[3,] 3 13 23 33 43 53 63 73 83 93
[4,] 4 14 24 34 44 54 64 74 84 94
[5,] 5 15 25 35 45 55 65 75 85 95
[6,] 6 16 26 36 46 56 66 76 86 96
[7,] 7 17 27 37 47 57 67 77 87 97
[8,] 8 18 28 38 48 58 68 78 88 98
[9,] 9 19 29 39 49 59 69 79 89 99
[10,] 10 20 30 40 50 60 70 80 90 100
b <- matrix(ncol=ncol(a), nrow=nrow(a))
for(i in 1:10) {
for(j in 1:10) {
if(sum(a[i+0:i,j])>120) {
b[i+0:i,j] <- a[i+0:i,j]
break}
}
}
这就是我得到的。
b
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] NA NA NA NA NA NA 61 NA NA NA
[2,] NA NA NA NA 42 NA 62 NA NA NA
[3,] NA NA NA 33 43 NA NA NA NA NA
[4,] NA NA 24 34 44 NA NA NA NA NA
[5,] NA NA 25 35 NA NA NA NA NA NA
[6,] NA NA 26 36 NA NA NA NA NA NA
[7,] NA NA 27 NA NA NA NA NA NA NA
[8,] NA NA 28 NA NA NA NA NA NA NA
[9,] NA NA 29 NA NA NA NA NA NA NA
[10,] NA NA 30 NA NA NA NA NA NA NA
但我希望它看起来像这样。
b
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] NA 11 21 31 41 51 61 71 81 91
[2,] NA 12 22 32 42 52 62 72 82 92
[3,] NA 13 23 33 43 53 NA NA NA NA
[4,] NA 14 24 34 NA NA NA NA NA NA
[5,] NA 15 25 NA NA NA NA NA NA NA
[6,] NA 16 26 NA NA NA NA NA NA NA
[7,] NA 17 NA NA NA NA NA NA NA NA
[8,] NA 18 NA NA NA NA NA NA NA NA
[9,] NA 19 NA NA NA NA NA NA NA NA
[10,] NA NA NA NA NA NA NA NA NA NA
感谢任何提示人员。
答案 0 :(得分:2)
它是你想要破解的i循环,而不是j,所以交换这些循环 - 然后看起来你在索引中遇到问题:b[i+0:i,j] <- a[i+0:i,j]
尝试:
a <- matrix(1:100, nrow=10)
b <- matrix(ncol=ncol(a), nrow=nrow(a))
for(j in 1:10) {
for(i in 1:10) {
if(sum(a[1:i,j])>120) {
b[1:i,j] <- a[1:i,j]
break
}
}
}
答案 1 :(得分:0)
如果我理解得很好,你可以试试这个:
max.col(t(apply(a, 1, cumsum)>=120), "first")
答案 2 :(得分:0)
这是一种矢量化方法:
a <- matrix(1:100, nrow=10)
## use columnwise cumsum
cs <- apply(a, 2, cumsum)
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] 1 11 21 31 41 51 61 71 81 91
# [2,] 3 23 43 63 83 103 123 143 163 183
# [3,] 6 36 66 96 126 156 186 216 246 276
# [4,] 10 50 90 130 170 210 250 290 330 370
# [5,] 15 65 115 165 215 265 315 365 415 465
# [6,] 21 81 141 201 261 321 381 441 501 561
# [7,] 28 98 168 238 308 378 448 518 588 658
# [8,] 36 116 196 276 356 436 516 596 676 756
# [9,] 45 135 225 315 405 495 585 675 765 855
# [10,] 55 155 255 355 455 555 655 755 855 955
## set cell to NA if the sum of the column is below 120
## or the value is the second value above 120
ifelse(rep(colSums(a) < 120, each=nrow(a)) | cs - 120 > a, NA, a)
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,] NA 11 21 31 41 51 61 71 81 91
# [2,] NA 12 22 32 42 52 62 72 82 92
# [3,] NA 13 23 33 43 53 NA NA NA NA
# [4,] NA 14 24 34 NA NA NA NA NA NA
# [5,] NA 15 25 NA NA NA NA NA NA NA
# [6,] NA 16 26 NA NA NA NA NA NA NA
# [7,] NA 17 NA NA NA NA NA NA NA NA
# [8,] NA 18 NA NA NA NA NA NA NA NA
# [9,] NA 19 NA NA NA NA NA NA NA NA
# [10,] NA NA NA NA NA NA NA NA NA NA