2014-03-31 1 views
1

아무에게도 도움을 줄 수 있습니까?다른 행 수를 루프 내에서 검색하려면

매트릭스의 열을 특정 합계로 검색하려고합니다 (예 : 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

'i + 0 : i'가 잘못되었습니다. 결과는'i + c (0,1,2, ..., i)'이다. 'i == 6 '이라면'i + i == 12'와'12> nrow (a)'때문에 실패 할 것이다. BTW IMHO 열은 '1 : 10'이어야하며 '아니요'('sum (1:10) <120'이므로)가 아니어야합니다. – sgibb

+0

예 i + 0 : 틀 렸습니다. 하지만 다른 무엇을 넣을 수있는 아이디어가 있습니까 – user3472591

답변

2

당신이하지 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 
    } 
    } 
} 
+0

감사합니다. 정확히 내가 뭘 찾고 있었는지! – user3472591

0

당신이 시도 할 수 있습니다 :

max.col(t(apply(a, 1, cumsum)>=120), "first") 
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 
관련 문제