识别数据维度

矩阵、数组和数据框的性质除了类和类型,还有维度。
1.获取数据维度
在 R 中,向量是通过一维数据结构创建的:
vec <- c(1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6)
class(vec)
## [1] "numeric"
typeof(vec)
## [1] "double"
同一底层数据可以被表示成多维数据结构,其维度可以通过 dim( )、nrow( )或
ncol( )来识别。
sample_matrix <- matrix(vec, ncol = 4)
sample_matrix
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 2 3 4 5
## [3,] 3 4 5 6
class(sample_matrix)
## [1] "matrix"
typeof(sample_matrix)
## [1] "double"
dim(sample_matrix)
## [1] 3 4
nrow(sample_matrix)
## [1] 3
ncol(sample_matrix)
## [1] 4
上述第一行表达式将一个数值向量 vec 转换成一个列数为 4 的矩阵。矩阵的类
为 matrix,但是 typeof( )仍保留了 vec 的类型 double。矩阵是一种具有维度的数据结
构,dim( )以向量形式展示了它的维度。函数 nrow( )和 ncol( )是获取行数和列数的
便捷方法。如果你阅读这两种函数的源代码,就会发现它们没有任何特别之处,就是分别
返回了 dim( )函数的第 1 个和第 2 个元素。
高维数据结构通常用数组表示。例如,同样的数据 vec 可以用 3 个维度表示,也就是
说,为了访问其中某个元素,你需要依次指定 3 个维度的 3 个位置:
sample_array <- array(vec, dim = c(2, 3, 2))
sample_array
## , , 1
##
## [,1] [,2] [,3]
## [1,] 1 3 3
## [2,] 2 2 4
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 3 5 5
## [2,] 4 4 6
class(sample_array)
## [1] "array"
typeof(sample_array)
## [1] "double"
dim(sample_array)
## [1] 2 3 2
nrow(sample_array)
## [1] 2
ncol(sample_array)
## [1] 3
与 matrix 类似,数组的类是 array,但仍保留了底层数据的数据类型。dim( )输出结
果的长度反映了数据的维度。
数据框是另一种具有维度概念的数据结构。然而,数据框与矩阵有本质差别。矩阵通
过对向量添加维度特性来得到,数据框则通过对列表添加成分等长的约束来得到:
sample_data_frame <- data.frame(a = c(1, 2, 3), b = c(2, 3, 4))
class(sample_data_frame)
## [1] "data.frame"
typeof(sample_data_frame)
## [1] "list"
dim(sample_data_frame)
## [1] 3 2
nrow(sample_data_frame)
## [1] 3
ncol(sample_data_frame)
## [1] 2
但是,dim( )、nrow( ) 和 ncol( ) 依旧适用于数据框。
2.重塑数据结构
表达式 dim(x)<-y 的语法意味着将 x 的维度值变成 y。
对于一个普通向量,这个表达式通过指定维度,将向量转换成矩阵:
sample_data <- vec
dim(sample_data) <- c(3, 4)
sample_data
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 2 3 4 5
## [3,] 3 4 5 6
class(sample_data)
## [1] "matrix"
typeof(sample_data)
## [1] "double"
可以看到对象的类由 numeric 变成 matrix,但对象的类型保持不变。
对于矩阵,这个表达式会将矩阵重新塑形:
dim(sample_data) <- c(4, 3)
sample_data
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 4
## [3,] 3 3 5
## [4,] 2 4 6
要注意到,改变向量、矩阵或者数组的维度,仅仅改变了对象的表现形式和访问方法,
并不改变存储在内存中的底层数据,理解这一点是很重要的。这样,将一个矩阵重塑成数
组,你就不会感到惊讶了:
dim(sample_data) <- c(3, 2, 2)
sample_data
## , , 1
##
## [,1] [,2]
## [1,] 1 2
## [2,] 2 3
## [3,] 3 4
##
## , , 2
##
## [,1] [,2]
## [1,] 3 4
## [2,] 4 5
## [3,] 5 6
class(sample_data)
## [1] "array"
很明显,只有当 prod(y) 等于 length(x) 时,表达式 dim(x)<-y 才会起作用,也
就是说,所有维度值的乘积必须等于数据元素的长度。否则,就会出现错误:
dim(sample_data) <- c(2, 3, 4)
## Error in dim(sample_data) <- c(2, 3, 4): dims [product 24]与对象长度[12]
不匹配
3.在一个维度上进行迭代
一个数据框通常是记录的集合,一行代表一条记录。对存储在数据框中的所有记录进
行迭代是很常见的。我们看看下列数据框:
sample_data_frame
## a b
## 1 1 2
## 2 2 3
## 3 3 4
对于这个数据框,我们使用 for 循环在 1:nrow(x)上进行迭代,也就是依次迭代每一
行来输出每条记录的各个变量的值:
for (i in 1:nrow(sample_data_frame)) {
# sample text:
# row #1, a: 1, b: 2
cat("row #", i, ", ",
"a: ", sample_data_frame[i, "a"],
", b: ", sample_data_frame[i, "b"],
"\n", sep = "")
}
## row #1,a: 1, b: 2
## row #2,a: 2, b: 3
## row #3,a: 3, b: 4

posted @ 2019-01-22 11:03  NAVYSUMMER  阅读(578)  评论(0编辑  收藏  举报
交流群 编程书籍