5.3 索引数组
和用于下标位置的索引向量一样,可以根据索引数组去给数组中不规则的元素集合赋值或者将数组中特定的元素返回到一个向量中。
用矩阵作为例子使这个过程变的更容易理解。在一个二维索引数组中,索引矩阵可以假定含有两列及任意多行。索引矩阵中的元素就是数组的行列索引。假定我们有一个 4×5 的数组 X
,我们可以做如下的事情:
以向量的格式取出元素
X[1,3], X[2,2]
和X[3,1]
,且在数组
X
中用0替换这些元素。
在这个例子中,我们需要一个 3×2 的下标数组,见下面的代码。
> x <- array(1:20, dim=c(4,5)) # 产生一个 4 × 5 的数组。
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
> x
> i # i是一个3×2的索引矩阵。
[,1] [,2]
[1,] 1 3
[2,] 2 2
[3,] 3 1
> x[i] # 提取这些元素。
[1] 9 6 3
> x[i] <- 0 # 用0替换这些元素。
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 0 13 17
[2,] 2 0 10 14 18
[3,] 0 7 11 15 19
[4,] 4 8 12 16 20
>
索引矩阵中不允许出现负数索引。NA
and 0 是被允许的:索引矩阵中包含0的行会被忽略,包含一个 NA
的行则会在结果中对应产生一个 NA
。
下面是一个不太明显的例子,假定我们要从两个因子 blocks
(b 水平)(b levels)和varieties
(v 水平)(v levels)定义的区组化设计(block design)实验中得到一个设计矩阵(design matrix)。进一步假定实验进行了 n
次。我们可以按下面的步骤进行:
> Xb <- matrix(0, n, b)
> Xv <- matrix(0, n, v)
> ib <- cbind(1:n, blocks)
> iv <- cbind(1:n, varieties)
> Xb[ib] <- 1
> Xv[iv] <- 1
> X <- cbind(Xb, Xv)
我们则可以用下面的办法创建关联矩阵N,
> N <- crossprod(Xb, Xv)
但是最简单最直接的办法是使用函数 table()
:
> N <- table(blocks, varieties)
索引矩阵必须是数值(numerical):作为矩阵提供的任何其他形式的矩阵(如逻辑型或字符型矩阵)均被视为索引向量。