嵌套循环的索引?

时间:2017-07-13 10:08:30

标签: r loops nested-loops

如果我想在循环中跟踪id:s,在列向量中存储该信息的便捷方法是执行类似...

res <- array(NA,
             dim = c(length(unique(id)),2),
             dimnames = NULL)

for (i in 1:3) {

    res[i,1] <- i

}

...这给了我类似的东西:

i  | - |
---| --|
1  |   |
2  |   |
3  |   |

现在,我想为嵌套循环做同样的事情,所以我尝试了:

res <- array(NA,
             dim = c(length(unique(id)*c(length(unique(t)),2),
             dimnames = NULL)

for (i in 1:3) {
  for (j in 1:3) {

    res[i,1] <- i
    res[j,2] <- j


  }
}

但结果是:

i  | j |
---| --|
1  | 1 |
2  | 2 |
3  | 3 |

显然这不是我想要的。相反,它应该是3 * 3行,如下所示:

i  | j |
---| --|
1  | 1 |
1  | 2 |
1  | 3 |
2  | 1 |
2  | 2 |
2  | 3 |
3  | 1 |
3  | 2 |
3  | 3 |

我如何得到这个?

2 个答案:

答案 0 :(得分:1)

有点hacky,但我认为这应该运行良好,特别是当你的迭代器可能变成整数以外的东西时:

id <- 1:9

res <- array(
  data = NA,
  dim = c(length(id), 2),
  dimnames = list(c(), c('i','j')))

k = 0
for (i in 1:3) {
  for (j in 1:3) {

    k = k+1
    res[k,1] <- i
    res[k,2] <- j


  }
}

输出:

> res
      i j
 [1,] 1 1
 [2,] 1 2
 [3,] 1 3
 [4,] 2 1
 [5,] 2 2
 [6,] 2 3
 [7,] 3 1
 [8,] 3 2
 [9,] 3 3

答案 1 :(得分:0)

在您的示例中,您依靠i作为索引。由于您只有i的三次迭代,因此i的所有值都将被覆盖,而j的值将不断被覆盖。 使用专用索引(ix)解决了这个问题。

这应该做你想要的:

res <- data.frame(i=NULL,j=NULL)

ix <- 0
for (i in 1:3){

  for (j in 1:3){

    ix <- ix+1

    res[ix,1] <- i
    res[ix,2] <- j


  }

}

输出:

> res
  V1 V2
1  1  1
2  1  2
3  1  3
4  2  1
5  2  2
6  2  3
7  3  1
8  3  2
9  3  3