R在循环内搜索不同的行数

时间:2014-03-31 08:49:05

标签: r if-statement for-loop

任何人都可以帮助我。

我正在尝试搜索矩阵的列以获得一定的总和(假设为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

感谢任何提示人员。

3 个答案:

答案 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