R: 向量 vs. 数组 vs. 矩阵 vs. 数据框 vector vs. array vs. matrix vs. data.frame

来源:互联网 发布:巨杉数据库 烂 编辑:程序博客网 时间:2024/05/17 03:19
在读R Document的时候经常会出现array这个词。array字面上很好理解,数组,但是数组跟矩阵、跟数据框(包括向量)有什么区别呢?

-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-

在C语言里(R就是基于C写出来的)也有数组这个概念,它是具有相同数据类型按一定次序排列的一组变量的集合体。在R里,array是这样定义的:

An array in R can have one, two or more dimensions. It is simply a vector which is stored with additional attributes giving the dimensions (attribute "dim") and optionally names for those dimensions (attribute "dimnames").

这段是说,如果你眼前的数据,不管是一维还是二维还是多维,如果有dim这个attribute,就可以算作一个数组(其实是有例外的)。先看几个例子帮助理解:

> # for a vector
> c <- b <- a <- 1:24
> is.vector(a)
[1] TRUE
> is.array(a)     # a simple vector is not an array
[1] FALSE
> dim(a) <- 24
> a
[1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
> dim(b) <- c(4, 6)
> dim(c) <- 2:4
> sapply(list(a,b,c),is.array)     # with the dimension(s), a vector becomes array
[1] TRUE TRUE TRUE
> sapply(list(a,b,c),is.matrix)     # a vector with 2 dimensions is a matrix
[1] FALSE  TRUE FALSE

从上面的例子可以得出关于R语言中array的四个结论:
  1. 一个简单赋值的vector(atomic vector,通常用c()创建)不是array;
  2. 只要添加dimension,vector就是个array; 
  3. 添加了一个dimension的vector跟没有添加dimension的vector在数据结构上是一样的,但是只有前者是一个array;
  4. 一个2维的vector等价于一个matrix。matrix是array在2维数据上的特殊表现形式。
那么array和data.frame的关系呢?互不相认,因为array必须是一个均匀的数据结构,二位以上的array每个元素的长度应该相等,每个元素的数据类型也应该是一致的。而data.frame和list不满足这两点要求,前者是因为可以储存多种变量类型,后者是因为可储存不同长度以及不同类型的数据。所以在R里,不管一组数据是不是均匀架构,只要它的class是data.frame或者list,R都会将它排除在array的定义之外。

> class(mtcars)
[1] "data.frame"
> m <- as.matrix(mtcars)
> is.array(class)
[1] FALSE
> is.array(m)
[1] TRUE
> l <- as.list(mtcars)
> is.array(l)
[1] FALSE

-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-

综上所述,array是一种数据结构,可简单理解为拥有dimension的vector(可以是1,2,...,n个维度)。它最常见的用法就是做为matrix去进行统计运算。data frame不能简单的理解为matrix,更不是一个array。
array作为一个概念经常出现在R Document中,对于没有IT背景的人(比如说我)来说刚开始看到的时候略航乱。其实在不同维度数量上(最常用的是1d和2d),我们可以找到分别对应的数据结构去进行替换和理解思考,以后见到就没那么惊悚了。

另外有个题外话,R里没有标量(Scalar)的概念。上面提到的没有dimension的vector有点类似scalar。

ref: Data Structure
0 0
原创粉丝点击