R中多维数组的子集分配

问题描述 投票:0回答:2

我正在尝试分配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

那么有没有更简单的方法分配给多维数组?

r arrays multidimensional-array indexing assign
2个回答
1
投票

您的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循环要简单,但是也许您会发现它更可取。


0
投票

阅读@ 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
© www.soinside.com 2019 - 2024. All rights reserved.