2.1 基本计算

2.1.1 数据类型

在R语言中,一切皆对象。对象是可以赋值给变量的任何事物,包括常量、数据结构、函数、甚至图形。每个对象都有类。R语言是面向对象的,R能处理的对象(包括数据)统称为object,一个object都有它所归属的类(class),一个class至少有一个特征是这类数据所共有的。类又可以被继承,产生儿孙类。

R语言中所有的对象都有2个内在属性,即:类型和长度。类型是对象元素的基本种类,长度是对象中元素的个数。R语言最基本的数据类型有:数值型(numeric)、复数型(complex)、逻辑型(logical)、字符型(character)等,还有不常用的类型,例如函数或表达式。

数据类型组成了对象,主要有6种结构,包括:向量、因子、数组、矩阵、列表、数据框等。多样化的数据对象赋予R语言灵活的数据处理能力。相关内容简述如下,详细内容可查阅帮助文件或有关文献。

(1)向量

向量(vector)是R语言处理数据的最基本单位,即可以是一串数字,也可以是一个数字。向量(vector)是虚拟类,本身不指定数据的存储类型,但赋值后立即变为数值型(numeric)、逻辑型(logical)、字符型(character)等实际数据类型。向量必须保证它的所有元素具有数据类型。

通过函数getClass()查到向量(vector)所包含的数据类型多达21种。 

一个向量只属于一种类型,如果改变了一个元素的值可能会改变该向量的类型。我们可通过以下函数进行查阅。

  • 数据存储类型:mode(变量名)
  • 数据所属类型:class(变量名)
  • 数据长度:length(变量名)
  • 数据类型或存储类型:typeof(变量名)
  • 数据结构:str(变量名) 

创建向量常用的函数有以下3种,具体用法请查阅帮助文件。

  • 函数c()表示将括号里面的内容组合成为一个向量。
  • 函数seq()可以产生等差数列。
  • 函数rep()可以产生重复的元素。    

通过方括号([ ])中给定元素所处位置的数值,可以访问向量中的元素。将一个值赋给某个向量(矩阵、数组、列表等)中一个不存在的元素时,R语言将自动扩展这个数据结构以容纳新值。 

(2)因子

因子(factor)是一类非常特殊的数据类型。在R中,类别变量和有序变量称为因子。一个因子不仅包括分类变量本身还包括变量不同的可能水平(即使它们在数据中不出现)。可使用函数factor()生成因子,具体赋值根据字母顺序确定,若指定参数order=TRUE,则可以声明有序型因子;也可以使用函数gl()生成因子。因子的种类称为水平(level)。

比如10个实测数据,前5个数据来自A,其余数据来自B,因子有两个水平(levels):A和B。  

(3)数组

数组(array)可以看作是带有多个下标类型相同的元素集合, 如数值型,它是矩阵(matrix)的推广。向量只有在定义了dim属性后才能作为数组使用,可以通过函数array()创建数组,参数vector为数组中的数据,dimensions设置维度,是一个数值型向量。 

(4)矩阵

矩阵(matrix)是一个双下标2维数组,每个元素拥有相同数据类型。它和数组(array)的继承关系比较复杂,既是父亲又是儿子,还是孙子。

向量数据可以使用函数dim()转换成矩阵。默认矩阵数据排列顺序为:先列后行,但是矩阵内数据的下标读取方式是:先行后列。x[2, 1]是第2行、第1列的值,x[2,]表示第2行的所有数据,x[,2]表示第2列的所有数据。函数dim()还可以获取或设置数据的维度。 

把一个向量转成矩阵还可以使用函数matrix(),参数nrow设置行数,ncol设置列数,byrow设置行列填充方式,默认(byrow=False)按列填充。 

几个长度相同的向量也可以合并到一个矩阵,函数cbind()将每个向量当成一列(按列)合并,函数rbind()按行合并。不同向量的数据类型要相同,否则转换成矩阵后数据类型会混搭。 

矩阵元素可通过下标和方括号引用,多维矩阵可以只用一个下标。 

(5)列表

列表(list)是R语言中最复杂的一种数据类型,它是对象的有序集合构成的对象,由向量直接派生而来。列表中包含的对象又称为分量,每个分量的长度和类型可以不同。列表列表可以组合不同的数据类型,甚至可以是其他列表,各组成数据的类、长度、维数都可以不一样。一个列表可以同时包括数值向量、逻辑向量、矩阵、复向量、字符数组、函数等。可以使用函数list()创建列表。 

注意在列表中[[…]]和[…]的含义是不一样的。

(6)数据框

数据框是R语言中最常用的数据结构,是一个属于data.frame类的列表,通过函数data.frame()可以创建数据框,即将几个不同类型但长度相同的向量合并到一个数据框,每一列的数据类型必须唯一。通过函数fix()可以编辑数据框,通过函数dim()查看数据框维度。

数据框的每列是一个向量,称为列向量。列向量只有两种类型,要么是数字型,要么是因子型。从文件读取或其他类型数据转换成数据框的数据,如果不是数值型,会被强制转换成因子型。有时候数值型(尤其是整型)向量也会被转成因子。 

数据框的外观和二维矩阵差不多,但它却不是矩阵。它的数据(.data)是列表数据,列表示变量,行表示观测值,列名称(names)就是列表中各项的名称,另外还有行名称(row.names)。数据框列表对象的分量必须是向量、数值、字符、逻辑、因子、数字矩阵、列表或其他数据框。合并的几个向量长度必需一致,即每列的行数必须相等。

数据框在使用时经常通过函数attach()和detach(),或单独使用函数with()来简化代码,否则必须使用美元符号“$”来指定对象中的特定部分。 

数据框可以用数字下标取数据,也可以用列名称下标取数据。两种方式所获数据的类型是不一样的,按列名称下标方式取得的数据仍然是数据框。因为同样的数据,在一些对类型要求很严格的操作(比如作图)中因为取数据方式的不一样会得到完全不一样的结果。

(7)特殊值数据

为确保所有数据都能被正确识别、计算或统计等,R定义了一些特殊值数据:NULL(空数据)、NA(无数据)、NaN(非数字)和inf(数字除以0得到的值),相应的判断函数如下:

  • is.null()
  • is.na()
  • is.nan()
  • is.infinite()