R – 数组
数组是由固定数量的维度定义的基本数据存储结构。数组用于在连续的内存位置分配空间。一维数组称为向量,长度是它们的唯一维度。二维数组称为矩阵,由固定数量的行和列组成。数组由相同数据类型的所有元素组成。向量作为输入提供给函数,然后根据维数创建一个数组。
创建一个数组
可以使用array()
函数创建 R 中的数组。元素列表与所需的维度一起传递给 array() 函数。
句法:
array(data, dim = (nrow, ncol, nmat), dimnames=names)
在哪里,
nrow : Number of rows
ncol : Number of columns
nmat : Number of matrices of dimensions nrow * ncol
dimnames : Default value = NULL.
否则,必须指定一个列表,其中包含维度的每个组件的名称。每个分量要么是空值,要么是长度等于相应维度的暗淡值的向量。
一维数组
向量是一维数组,由一维长度指定。可以使用“ 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 个索引大于数组的长度。