r - 项目 R : Variable "depth" of for-loops; generalization

标签 r for-loop

谢谢你帮我解决这个问题。这是一个困扰我很长时间的问题。我觉得我已经很接近答案了,但还没有完全实现。 问题如下:

假设我想组合 n 个向量的 m 个元素的所有可能组合,并存储乘法的结果。对于二维问题,我需要两个交错的 for 循环:

dim2_Matrix <- matrix(0,nrow=2,ncol=3)
for (i in 1:2){
  for (j in 1:3){
  dim2_Matrix[i,j] <- i*j
  }
}

内循环将遍历所有 3 个项目,并将它们与外循环的第一项相乘。一旦该过程完成,i 将增加,内部循环再次从 j=1 开始。我们有 2*3 = 6 种组合。

现在让我们将其提升为 3D 问题。我们需要第三个循环:

dim3_Matrix <- array(0,dim=c(2,3,4))

for (i in 1:2){
  for (j in 1:3){
    for (k in 1:4){
      dim3_Matrix[i,j,k] <- i*j*k
    }
  }
}

它运行最内层循环 4 次,增加中间循环,再次运行 4 个内层循环...直到我们在 3D 数组中获得 2*3*4 = 24 个组合。

我可以像这样继续使用 dim4、dim5 等。 我现在的问题是我想保持脚本变量。有时我想组合 2 个、有时 3 个、有时 n 个向量。假设我知道循环运行之前有多少“层”......我如何获得它的通用形式?

我到目前为止:

n_dimensions <- 3 # specify n° of dimensions
m_Elements <- c(2,3,4) # 2 elements in 1st dim, 3 in 2nd, 4 in 3rd

for (i in 1:n_dimensions){
  for (j in 1:m_Elements[i]){
    # ...
  }
}

但这会是这样的:

i1 j1 --> i1 j2

i2 j1 --> i2 j2 --> i2 j3

i3 j1 --> i3 j2 --> i3 j3 --> i3 j4

所以这是 2 + 3 + 4 组合,而不是 2*3*4。

请注意:乘法只是一个示例。将结果存储在矩阵/张量中不是主要问题。这是如何交织循环并概括它。

感谢您的阅读,希望您明白我的意思!

最佳答案

你可以尝试这样的事情。

X<-list(1:2, 1:3, 1:4)  #one entry for each dimension
Z<-expand.grid(X)

Z 看起来像:

   Var1 Var2 Var3
1     1    1    1
2     2    1    1
3     1    2    1
4     2    2    1
5     1    3    1
6     2    3    1
7     1    1    2
8     2    1    2
9     1    2    2
10    2    2    2 
11    1    3    2
12    2    3    2
13    1    1    3
14    2    1    3
15    1    2    3
16    2    2    3
17    1    3    3
18    2    3    3
19    1    1    4
20    2    1    4
21    1    2    4
22    2    2    4
23    1    3    4
24    2    3    4

现在,您在 data.frame 中拥有了所有组合,并且您可以使用应用函数或类似的函数来执行您需要执行的操作。如:

apply(Z,1,prod)

 [1]  1  2  2  4  3  6  2  4  4  8  6 12  3  6  6 12  9 18  4  8  8 16 12 24

关于r - 项目 R : Variable "depth" of for-loops; generalization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27862949/

相关文章:

java - 在 Java 中显示 Rserve 的结果(R 和 Java 的集成)

R : confidence interval being partially displayed with ggplot2 (using geom_smooth())

python - 如果元素包含特定字符,则从列表或集合中删除元素

swift - 你能告诉 for 循环有条件地前进不止一步吗?

python - 列表打印未按需要进行。制作的图案是逆时针90度

java - 为什么我的条件从来没有满足过?

r - 用NA替换零以表示非零之前的值

r - 编写使用运算符传递值的 R 函数

r - 如何在 R 中创建自累积向量

java - 非常基本的Java嵌套for循环问题