如何使用for嵌套循环填充三维数组
我想使用嵌套循环创建一个三维数组,问题是循环似乎不起作用。 代码是:如何使用for嵌套循环填充三维数组,r,arrays,for-loop,R,Arrays,For Loop,我想使用嵌套循环创建一个三维数组,问题是循环似乎不起作用。 代码是: s = array(NA,dim=c(5,5,4),dimnames=list(0:4,0:4,1:4)) for (i in 1:4) { for (j in 0:i ) { for (k in 0:i) { s[j,k,i]=(j+i+k) } } } 我希望矩阵中的每个元素(例如元素(j,k,I)都可以是(j+k+I),但是,最终结果中有许多NAs,我如何更改代码使其工作
s = array(NA,dim=c(5,5,4),dimnames=list(0:4,0:4,1:4))
for (i in 1:4)
{
for (j in 0:i )
{
for (k in 0:i)
{
s[j,k,i]=(j+i+k)
}
}
}
我希望矩阵中的每个元素(例如元素(j,k,I)都可以是(j+k+I),但是,最终结果中有许多NAs,我如何更改代码使其工作?与其他一些语言不同,在R中,原始基结构中没有零元素。因此,尝试分配第0个元素不会分配(有趣的是,这不会引起警告或错误)。因此,对于@r2evans注释,您需要通过指定的
dimnames
引用,这些名称总是强制为字符值
此外,要填充所有NAs,对于所有可能的组合,for的内部循环需要扩展到值的全长,而不是终止于i
### BY DIMNAMES
s1 <- array(NA, dim=c(5,5,4), dimnames=list(0:4,0:4,1:4))
for (i in 1:4)
{
for (j in 0:4) # DO NOT END AT i
{
for (k in 0:4) # DO NOT END AT i
{
s1[as.character(j),as.character(k),as.character(i)] <- (j+i+k)
}
}
}
可选地,考虑一个应用程序解决方案,使用代码< > MyPo< <代码>,首先生成所有可能的与扩展.GRID()/<代码>的组合,然后元素化地迭代向量,而不是按索引赋值并担心<代码> DimNeX/COD>,所有元素都分配给<代码> []/COD>:
s3 <- array(NA, dim=c(5,5,4), dimnames=list(0:4,0:4,1:4))
prms <- expand.grid(j=0:4, k=0:4, i=1:4)
s3[] <- mapply(function(i,j,k) (j+i+k), prms$j, prms$k, prms$i)
identical(s1, s3)
#[1] TRUE
(1) 当您使用[j,k,i]
进行索引时,您是在数字列上进行索引,而不是在指定的名称上进行索引。如果要使用这些名称,它们必须是字符,例如s[as.character(j)、as.character(k)、as.character(i)]
(这将解决缺少“0”
平面的问题。(2)其余的NA
s是因为你的循环。你期望零吗?(换言之,s[1,1,1]
在每个轴的第一个位置抓取第一个单元格,而s[“1”、“1”、“1”]
根据你的dim名称抓取第二行、第二列、第一个z平面。)谢谢你的回答,因为这个数组将形成三个矩阵,我希望第一个矩阵,第1行和第2列中的元素是0+1+1(j=0,k=1,I=1),但是我写的循环创建了一个NA。我想你没有领会我的意思。第1行1
,第2列2
,平面1
中的元素与第1行中的元素不同
,列“2”
,平面“1”
。当您使用字符串而不是数字时,对我来说效果很好。(s[1,2,1]==2
对我来说是正确的。)
s3 <- array(NA, dim=c(5,5,4), dimnames=list(0:4,0:4,1:4))
prms <- expand.grid(j=0:4, k=0:4, i=1:4)
s3[] <- mapply(function(i,j,k) (j+i+k), prms$j, prms$k, prms$i)
identical(s1, s3)
#[1] TRUE
s4 <- array(NA, dim=c(5,5,4), dimnames=list(0:4,0:4,1:4))
prms <- expand.grid(j=0:4, k=0:4, i=1:4)
s4[] <- prms$j + prms$k + prms$i
identical(s1, s4)
#[1] TRUE