我正在尝试分配3D数组的行,但我不知道该怎么做。
我有一个2D索引数组,其中每一行对应于3D数组的第一个索引和第二个索引,还有一个2D值数组,我想将其插入3D数组。我发现执行此操作的最简单方法是
indexes <- cbind(1:30, rep(c(1, 2), 15))
rows <- cbind(1:20, 31:50, 71:90)
for (i in 1:nrow(indexes)) for (j in 1:3)
data[indexes[i,1], indexes[i,2], j] <- rows[i, j]
但是这很难读,因为它使用嵌套索引,所以我希望有一种更简单的方法,例如
data[indexes,] <- rows
(这不起作用)
我尝试过的事情:
[this question显示如何索引数组(无分配)
apply(data, 3, `[`, indexes)
但是这不允许分配
apply(data, 3, `[`, indexes) <- rows #: could not find function "apply<-"
也不使用[<-
起作用:
apply(data, 3, `[<-`, indexes, rows)
因为将行视为向量。
以下两项均无效
data[indexes[1], indexes[2],] <- rows #: subscript out of bounds
data[indexes,] <- rows #: incorrect number of subscripts on matrix
那么有没有更简单的方法分配给多维数组?
您的indexes
变量表示data
的第一个暗度为30,但rows[30,j]
不存在。因此,您的问题不太适合提出,我将对其进行更改。
基本思想是,您可以通过n x 3
矩阵为3路数组建立索引。矩阵的每一行都对应于三向数组中的一个位置,因此,如果要将条目数据[1,2,3]设置为4,并将条目数据[5,6,7]设置为8,则可以使用
index <- rbind(c(1,2,3), c(5,6,7))
data[index] <- c(4,8)
您将需要扩展您的indexes
变量来复制每行3次,然后将rows
矩阵作为向量读取,然后工作:
data <- array(NA, dim=c(30, 2, 3))
indexes <- cbind(1:30, rep(c(1, 2), 15))
rows <- cbind(1:30, 31:60, 71:100)
indexes1 <- indexes[rep(1:nrow(indexes), each = 3),]
indexes2 <- cbind(indexes1, 1:3)
data[indexes2] <- t(rows) # Transpose because R reads down columns first
我不认为这比使用for循环要简单,但是也许您会发现它更可取。
阅读@ user2554330的答案后,我找到了一个稍微简单的解决方案
# initialize as in user2554330's answer
data <- ...
indexes <- ...
rows <- ...
indexes3 <- as.matrix(merge(indexes, 1:3))
data[indexes3] <- rows
indexes2
和indexes3
的比较(使用更少的元素:]
# print(indexes2)
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 1 1 2
[3,] 1 1 3
[4,] 2 2 1
[5,] 2 2 2
[6,] 2 2 3
[7,] 3 1 1
[8,] 3 1 2
[9,] 3 1 3
[10,] 4 2 1
[11,] 4 2 2
[12,] 4 2 3
# print(indexes3)
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 2 1
[3,] 3 1 1
[4,] 4 2 1
[5,] 1 1 2
[6,] 2 2 2
[7,] 3 1 2
[8,] 4 2 2
[9,] 1 1 3
[10,] 2 2 3
[11,] 3 1 3
[12,] 4 2 3