谢谢你帮我解决这个问题。这是一个困扰我很长时间的问题。我觉得我已经很接近答案了,但还没有完全实现。 问题如下:
假设我想组合 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/