📜  R – 数组

📅  最后修改于: 2022-05-13 01:54:23.391000             🧑  作者: Mango

R – 数组

数组是由固定数量的维度定义的基本数据存储结构。数组用于在连续的内存位置分配空间。一维数组称为向量,长度是它们的唯一维度。二维数组称为矩阵,由固定数量的行和列组成。数组由相同数据类型的所有元素组成。向量作为输入提供给函数,然后根据维数创建一个数组。

创建一个数组

可以使用array()函数创建 R 中的数组。元素列表与所需的维度一起传递给 array() 函数。

句法:

array(data, dim = (nrow, ncol, nmat), dimnames=names)

在哪里,

否则,必须指定一个列表,其中包含维度的每个组件的名称。每个分量要么是空值,要么是长度等于相应维度的暗淡值的向量。

一维数组

向量是一维数组,由一维长度指定。可以使用“ c() ”函数创建向量。将值列表传递给 c()函数以创建向量。

例子:

vec1 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
print (vec1)
  
# cat is used to concatenate
# strings and print it.
cat ("Length of vector : ", length(vec1))

输出:

[1] 1 2 3 4 5 6 7 8 9
Length of vector :  9

多维数组

二维矩阵是由固定数量的行和列指定的数组,每个包含相同的数据类型。使用array()函数创建矩阵,将值和维度传递给该函数。

例子:

# arranges data from 2 to 13 
# in two matrices of dimensions 2x3
arr = array(2:13, dim = c(2, 3, 2))
print(arr)

输出:

, , 1

     [,1] [,2] [,3]
[1,]    2    4    6
[2,]    3    5    7

, , 2

     [,1] [,2] [,3]
[1,]    8   10   12
[2,]    9   11   13

不同长度的向量也可以作为array()函数的输入。但是,组合的所有向量中的元素总数应等于矩阵中的元素数。元素按照它们在函数中指定的顺序排列。
例子:

vec1 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
vec2 <- c(10, 11, 12)
  
# elements are combined into a single vector, 
# vec1 elements followed by vec2 elements.
arr = array(c(vec1, vec2), dim = c(2, 3, 2))
print (arr)

输出:

,, 1
     [, 1] [, 2] [, 3]
[1, ]    1    3    5
[2, ]    2    4    6
,, 2
     [, 1] [, 2] [, 3]
[1, ]    7    9   11
[2, ]    8   10   12

数组命名

行名称、列名称和矩阵名称分别指定为行数、列数和矩阵数的向量。默认情况下,行、列和矩阵由它们的索引值命名。

row_names <- c("row1", "row2")
col_names <- c("col1", "col2", "col3")
mat_names <- c("Mat1", "Mat2")
  
# the naming of the various elements
# is specified in a list and 
# fed to the function
arr = array(2:14, dim = c(2, 3, 2), 
            dimnames = list(row_names, 
                            col_names, mat_names))
print (arr)

输出:

,, Mat1
     col1 col2 col3
row1    2    4    6
row2    3    5    7
,, Mat2
     col1 col2 col3
row1    8   10   12
row2    9   11   13

访问数组

可以通过使用逗号分隔的不同维度的索引来访问数组。可以通过元素名称或位置的任意组合来指定不同的组件。

访问一维数组

可以通过使用相应元素的索引来访问元素。

vec <- c(1:10)
  
# accessing entire vector
cat ("Vector is : ", vec)
  
# accessing elements
cat ("Third element of vector is : ", vec[3])

<输出:

Vector is :  1 2 3 4 5 6 7 8 9 10
Third element of vector is : 3

访问整个矩阵

vec1 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
vec2 <- c(10, 11, 12)
row_names <- c("row1", "row2")
col_names <- c("col1", "col2", "col3")
mat_names <- c("Mat1", "Mat2")
arr = array(c(vec1, vec2), dim = c(2, 3, 2), 
              dimnames = list(row_names, 
                              col_names, mat_names))
  
# accessing matrix 1 by index value
print ("Matrix 1")
print (arr[,,1])
  
# accessing matrix 2 by its name
print ("Matrix 2")
print(arr[,,"Mat2"])

输出:

[1] "Matrix 1"
     col1 col2 col3
row1    1    3    5
row2    2    4    6
[1] "Matrix 2"
     col1 col2 col3
row1    7    9   11
row2    8   10   12

访问矩阵的特定行和列

行和列也可以通过名称和索引来访问。

vec1 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
vec2 <- c(10, 11, 12)
row_names <- c("row1", "row2")
col_names <- c("col1", "col2", "col3")
mat_names <- c("Mat1", "Mat2")
arr = array(c(vec1, vec2), dim = c(2, 3, 2), 
           dimnames = list(row_names, 
                           col_names, mat_names))
   
# accessing matrix 1 by index value
print ("1st column of matrix 1")
print (arr[, 1, 1])
  
# accessing matrix 2 by its name
print ("2nd row of matrix 2")
print(arr["row2",,"Mat2"])

输出:

[1] "1st column of matrix 1"
row1 row2 
   1    2 
[1] "2nd row of matrix 2"
col1 col2 col3 
   8   10   12 

单独访问元素

可以通过使用行号和列号或名称来访问元素。

vec1 <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
vec2 <- c(10, 11, 12)
row_names <- c("row1", "row2")
col_names <- c("col1", "col2", "col3")
mat_names <- c("Mat1", "Mat2")
arr = array(c(vec1, vec2), dim = c(2, 3, 2), 
      dimnames = list(row_names, col_names, mat_names))
  
# accessing matrix 1 by index value
print ("2nd row 3rd column matrix 1 element")
print (arr[2, "col3", 1])
  
# accessing matrix 2 by its name
print ("2nd row 1st column element of matrix 2")
print(arr["row2", "col1", "Mat2"])

输出:

[1] "2nd row 3rd column matrix 1 element"
[1] 6
[1] "2nd row 1st column element of matrix 2"
[1] 8

访问数组元素的子集

可以通过定义行或列限制范围来访问数组元素的较小子集。

row_names <- c("row1", "row2")
col_names <- c("col1", "col2", "col3", "col4")
mat_names <- c("Mat1", "Mat2")
arr = array(1:15, dim = c(2, 4, 2), 
      dimnames = list(row_names, col_names, mat_names))
  
# print elements of both the rows and columns 2 and 3 of matrix 1
print (arr[, c(2, 3), 1])

输出:

col2 col3
row1    3    5
row2    4    6

向数组添加元素

元素可以附加到数组中的不同位置。元素的序列按照它们添加到数组的顺序保留。添加新元素所需的时间复杂度为 O(n),其中 n 是数组的长度。数组的长度随着元素添加的数量而增加。 R 中有多种内置函数可用于添加新值:

  • c(vector, values): c()函数允许我们将值附加到数组的末尾。也可以将多个值相加。
  • append(vector, values):此方法允许将值附加到向量中的任何位置。默认情况下,此函数在末尾添加元素。

    append(vector, values, after=length(vector))在函数的最后一个参数中指定的数组的指定长度之后添加新值。

  • 使用数组的长度函数:
    可以在 x>0 的 length+x 索引处添加元素。
    # creating a uni-dimensional array
    x <- c(1, 2, 3, 4, 5)
      
    # addition of element using c() function
    x <- c(x, 6)
    print ("Array after 1st modification ")
    print (x)
      
    # addition of element using append function
    x <- append(x, 7)
    print ("Array after 2nd modification ")
    print (x)
       
    # adding elements after computing the length
    len <- length(x)
    x[len + 1] <- 8
    print ("Array after 3rd modification ")
    print (x)
      
    # adding on length + 3 index
    x[len + 3]<-9
    print ("Array after 4th modification ")
    print (x)
      
    # append a vector of values to the array after length + 3 of array
    print ("Array after 5th modification")
    x <- append(x, c(10, 11, 12), after = length(x)+3)
    print (x)
      
    # adds new elements after 3rd index
    print ("Array after 6th modification")
    x <- append(x, c(-1, -1), after = 3)
    print (x)
    


    输出:

    [1] "Array after 1st modification "
    [1] 1 2 3 4 5 6
    [1] "Array after 2nd modification "
    [1] 1 2 3 4 5 6 7
    [1] "Array after 3rd modification "
    [1] 1 2 3 4 5 6 7 8
    [1] "Array after 4th modification "
    [1]  1  2  3  4  5  6  7  8 NA  9
    [1] "Array after 5th modification"
    [1]  1  2  3  4  5  6  7  8 NA  9 10 11 12
    [1] "Array after 6th modification"
    [1]  1  2  3 -1 -1  4  5  6  7  8 NA  9 10 11 12

    数组的原始长度为 7,经过第三次修改后,元素一直存在到第 8 个索引值。现在,在第四次修改中,当我们在第 10 个索引值处添加元素 9 时,R 的内置函数会在缺失值位置自动添加 NA。
    在第 5 次修改中,元素数组 [10, 11, 12] 从第 11 个索引开始添加。
    在第 6 次修改中,数组 [-1, -1] 被附加到数组中的第三个位置之后。

从数组中删除元素

可以从 R 中的数组中删除元素,一次一个或多个一起删除。这些元素被指定为数组的索引,其中满足条件的数组值被保留并被移除。移除比较基于数组值。也可以将多个条件组合在一起以删除一系列元素。删除元素的另一种方法是使用%in%运算符,其中将属于运算符的 TRUE 值的元素值集显示为结果,其余的将被删除。

# creating an array of length 9
m <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
print ("Original Array")
print (m)
          
# remove a single value element:3 from array
m <- m[m != 3]
print ("After 1st modification")
print (m)
  
# removing elements based on condition
# where either element should be 
# greater than 2 and less than equal to 8
m <- m[m>2 & m<= 8]
print ("After 2nd modification")
print (m)
  
# remove sequence of elements using another array
remove <- c(4, 6, 8)
  
# check which element satisfies the remove property
print (m % in % remove)
print ("After 3rd modification")
print (m [! m % in % remove])

输出:

[1] "Original Array"
[1] 1 2 3 4 5 6 7 8 9
[1] "After 1st modification"
[1] 1 2 4 5 6 7 8 9
[1] "After 2nd modification"
[1] 4 5 6 7 8
[1]  TRUE FALSE  TRUE FALSE  TRUE
[1] "After 3rd modification"
[1] 5 7

在第一次修改时,所有不等于 3 的元素值都被保留。在第 2 次修改中,保留 2 到 8 之间的元素范围,删除其余元素。在第 3 次修改时,打印满足 FALSE 值的元素,因为条件涉及 NOT运算符。

更新数组的现有元素

通过为数组的所需索引分配修改后的值,可以用新值更新数组的元素。更改保留在原始数组中。如果要更新的索引值在数组长度范围内,则更改该值,否则在指定索引处添加新元素。多个元素也可以一次更新,使用相同的元素值或多个值,以防新值被指定为向量。

# creating an array of length 9
m <- c(1, 2, 3, 4, 5, 6, 7, 8, 9)
print ("Original Array")
print (m)
   
# updating single element
m[1] <- 0
print ("After 1st modification")
print (m)
   
# updating sequence of elements
m[7:9] <- -1
print ("After 2nd modification")
print (m)
   
# updating two indices with two different values
m[c(2, 5)] <- c(-1, -2)
print ("After 3rd modification")
print (m)
   
# this add new element to the array
m[10] <- 10
print ("After 4th modification")
print (m)

输出:

[1] "Original Array"
[1] 1 2 3 4 5 6 7 8 9
[1] "After 1st modification"
[1] 0 2 3 4 5 6 7 8 9
[1] "After 2nd modification"
[1]  0  2  3  4  5  6 -1 -1 -1
[1] "After 3rd modification"
[1]  0 -1  3  4 -2  6 -1 -1 -1
[1] "After 4th modification"
 [1]  0 -1  3  4 -2  6 -1 -1 -1 10

在第二次修改中,索引 7 到 9 处的元素每个都更新为 -1。在第 3 次修改中,第二个元素被 -1 和第五个元素分别替换为 -2。在第 4 次修改时,添加了一个新元素,因为第 10 个索引大于数组的长度。