R中多维数组的子集赋值



我正在尝试分配 3D 数组的行,但我不知道如何准确。

我有一个 2D 索引数组,其中每行对应于 3D 数组的第一个和第二个索引,还有一个我想插入到 3D 数组中的 2D 值数组。我发现最简单的方法是

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

(这不起作用(


我尝试过:

此问题显示如何为数组编制索引(不赋值(

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的第一个 dim 为 30,但rows[30,j]不存在。 所以你的问题没有很好地提出,我会改变它。

基本思想是,您可以通过n x 3矩阵索引 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

indexes2indexes3的比较(使用较少的元素(:

# 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

最新更新