跳至主要内容

R 中的数组

了解 R 中的数组,包括带示例的索引方法,以及矩阵的创建与相加及 apply() 函数。
· 8分钟 阅读

使用 AI 探索

数组是一种可以容纳多维数据的数据结构。在 R 中,数组是可以容纳两个或两个以上维度数据的对象。例如,方阵可以包含两行两列,维度也可以取到五。数组只能存储同一数据类型的值。数据可以是多维的,即包含若干长度的行、列和维度。

创建数组

array() 函数用于创建数组,它在参数中接收一个向量(数字)以及维度('dim')。

下面我们来看一个示例,创建名为“array1”和“array2”的两个向量。

vector1 =  c (5, 10, 15,20)
vector2 =  c (25, 30, 35, 40, 45, 50,55,60)

您可以将上面的两个向量作为数组的输入,其中维度设为 4 * 4,并创建出两个矩阵或维度数据。

final = array (c (array1, array2),dim =c(4,4,3))
print (final)

上述代码的输出如下:

, , 1

     [,1] [,2] [,3] [,4]
[1,]    5   25   45    5
[2,]   10   30   50   10
[3,]   15   35   55   15
[4,]   20   40   60   20

, , 2

     [,1] [,2] [,3] [,4]
[1,]   25   45    5   25
[2,]   30   50   10   30
[3,]   35   55   15   35
[4,]   40   60   20   40

, , 3

     [,1] [,2] [,3] [,4]
[1,]   45    5   25   45
[2,]   50   10   30   50
[3,]   55   15   35   55
[4,]   60   20   40   60

我们使用 "matrix.names" 将数组重命名为 "Arr1" 和 "Arr2"。另外,将行名改为 ("row1","row2"),列名改为 ("column1","column2","column3")。矩阵的维度为 2 行 3 列。

array1 =  c (9 , 18 )
array2 = c (27,36)
r.names = c ("column1","column2","column3")
c.names = c ("row1","row2")
m.names = c ("Arr1", "Arr2")

final = array (c (array1,array2), dim=c (2,3,2), dimnames=list (c.names, r.names, m.names))
print(final)

上述代码的输出如下,其中有两行三列。此外,当某一列的取值用完后会重复填充:

, , Arr1

     column1 column2 column3
row1       9      27       9
row2      18      36      18

, , Arr2

     column1 column2 column3
row1      27       9      27
row2      36      18      36

数组中的索引

数组以多维形式包含元素,可对每个元素进行访问操作。可以使用“[]”进行索引,其中类矩阵的数组包含行与列,索引方式为:mat[row, column]

下面举例说明:数组包含从 1 到 9 的向量输入。只有三行三列,数值覆盖 1 到 9。'c.names)' 是新的列名,对应向量('c1'、'c2'、'c3'),而 'r.names' 是新的行名('r1'、'r2'、'r3'),同样是向量。

a1=  c (1,2,3,4)
a2= c (5,6,7,8,9)
r.names = c ("c1","c2","c3")
c.names = c ("r1","r2","r3")
m.names = c ("first")

arr = array (c (a1,a2), dim=c (3,3,1), dimnames=list (c.names, r.names, m.names))
print(arr)
, , first

   c1 c2 c3
r1  1  4  7
r2  2  5  8
r3  3  6  9

上述代码的输出如下:

 , , first

   c1 c2 c3
r1  1  4  7
r2  2  5  8
r3  3  6  9 

可以看到,1 到 9 的矩阵以 3 3(行 列)的形式生成,同时行名与列名也已更新。

接下来看看如何提取数组中的元素。

  1. 从上述数组 'arr' 中提取数字“7”。
arr[1,3,1]

7

以上代码的输出为 7。在 'arr[1,3,1]' 中,行 1、列 3,1 表示第一层数组 'arr' 被提取。

  1. 要访问 1,'arr[1,1,1]' 表示行 1、列 1,1 表示第一层数组 'arr' 被提取。
arr[1,1,1]

1

以上代码的输出为 1。

  1. 若要一次访问多个值,需要指定所需的范围。
arr[1:2,1:2,1]
 c1c2
r114
r225

上述代码的输出如下,提取了包含 2 行、2 列的值,其中 1 表示提取第一层数组 'arr':

    c1    c2
r1    1    4
r2    2    5 
  1. 您可以使用以下语法访问整个数组 'arr',其中 'arr[ , ,1]' 表示包含所有行与所有列(用逗号和空格分隔),1 表示要提取第一层数组 'arr'。
arr[ , ,1]
 c1c2c3
r1147
r2258
r3369

上述代码的输出如下,包含了所有元素:

    c1    c2    c3
r1    1    4    7
r2    2    5    8
r3    3    6    9 
  1. 您可以使用下面的代码获取整行第二行,其中 arr[2, ,1] 提取带空位的第二行,1 表示要提取的 'arr'。
arr[2,,1]
c1
2
c2
5
c3
8

上述代码给出如下输出,同时打印 c1、c2、c3。

c1 2
c2 5
c3 8
  1. 您可以使用下面的代码获取整列第二列,其中 arr[,2,1] 中的 2 表示第二列,1 表示要提取的 'arr'。
mat[ ,2,1]
r1
4
r2
5
r3
6

上述代码给出如下输出,同时打印 r1、r2、r3。

r1 4
r2 5
r3 6

矩阵的创建与相加

从 'arr[ , ,1]' 创建名为 mat1 和 mat2 的矩阵,即将 'arr' 的整行整列复制出来。

mat1 = arr[,,1]
mat2 = arr[,,1]
   c1 c2 c3
r1  2  8 14
r2  4 10 16
r3  6 12 18 

将两个矩阵 'mat1' 与 'mat2' 相加,并将结果存入 final,同时打印输出。

final <- mat1+mat2
print(final)

下面的输出显示 mat1 与 mat2 的各行各列对应相加。

   c1 c2 c3
r1  2  8 14
r2  4 10 16
r3  6 12 18 

apply()

“apply()” 属于 R 包 家族之一,包含多个函数,可帮助更轻松高效地编写代码。下面的示例展示了如何按列计算两个数组的和。

apply() 的语法为:
apply(x, margin, function)

上述参数说明:
x:数组或作为矩阵的二维数据。
margin:指示要应用函数的维度,c(1) 表示按行,c(2) 表示按列,c(1,2) 表示同时按行与列。
function:指要应用于给定数据的 R 内置或用户自定义函数。

使用下面的代码创建长度为三的向量“array1”和长度为六的向量“array2”。

array1 = c(5,10,15)
array2 = c(15,20,25,30,35,40)

如下所示,'array()' 接收名为 'array1' 和 'array2' 的两个向量,维度为 3 行、3 列,并创建出 2 个矩阵,存入 'my. Array'。

my.Array <- array(c(array1,array2),dim = c(3,3,2))
print(my.Array)
, , 1

     [,1] [,2] [,3]
[1,]    5   15   30
[2,]   10   20   35
[3,]   15   25   40

, , 2

     [,1] [,2] [,3]
[1,]    5   15   30
[2,]   10   20   35
[3,]   15   25   40

上述代码产生如下输出,即创建了两个 3 3(行 列)的矩阵。

, , 1

     [,1] [,2] [,3]
[1,]    5   15   30
[2,]   10   20   35
[3,]   15   25   40

, , 2

     [,1] [,2] [,3]
[1,]    5   15   30
[2,]   10   20   35
[3,]   15   25   40

下面使用 'apply()' 按列计算这两个矩阵的和。

final <- apply(my.Array, c(2), sum)
print(final)
[1]  60 120 210

可以看到,这里 margin 使用 c(2),即对 'my. Array' 中矩阵的元素按列求和,得到以下输出。

60 120 210

最后,下面使用 'apply()' 按行计算这两个矩阵的和。

final <- apply(my.Array, c(1), sum)
print(final)
[1] 100 130 160

可以看到,这里 margin 使用 c(1),即对 'my. Array' 中矩阵的元素按行求和,得到以下输出。

100 130 160

恭喜

恭喜您,已完成本教程的全部内容!

您已经了解了 R 的数组,包括其创建方式、数组索引示例,以及矩阵的创建与相加,还有 apply() 函数。

如果您想进一步学习 R,请参加 DataCamp 的R 入门课程。

参考资料:
R-Arrays
R Array Function and Create Array in R

主题