R语言数据结构

Python018

R语言数据结构,第1张

阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通

过函数matrix()创建矩阵。一般使用格式为

其中vector包含了矩阵的元素,nrow和ncol用以指定行和列的维数,dimnames包含了可选

的、以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行填充(byrow=TRUE)

还是按列填充(byrow=FALSE),默认情况下按列填充

数组(array)与矩阵类似,但是维度可以大于2, 数组可通过array函数创建,形式如下:

myarray <- array(vector, dimensions, dimnames)

其中vector包含了数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大

值,而dimnames是可选的、各维度名称标签的列表

由于不同的列可以包含不同模式(数值型、字符型等)的数据,数据框的概念较矩阵来说更

为一般。它与你通常在SAS、SPSS和Stata中看到的数据集类似。数据框将是你在R中最常处理的

数据结构

数据框可通过函数data.frame()创建

其中的列向量col1、col2、col3等可为任何类型(如字符型、数值型或逻辑型)。每一列的名

称可由函数names指定

每一列数据的模式必须唯一,不过你却可以将多个模式的不同列放到一起组成数据框。由于数据框与分析人员通常设想的数据集的形态较为接近,我们在讨论数据框时将交替使用术语列和

变量

类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现

函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1...k](其中k是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上

对于字符型向量,因子的水平默认依字母顺序创建。这对于因子status是有意义的,因为

“Excellent”“Improved”“Poor”的排序方式恰好与逻辑顺序相一致。如果“Poor”被编码为

“Ailing”,会有问题,因为顺序将为“Ailing”“Excellent”“Improved”。如果理想中的顺序是“Poor” “Improved”“Excellent”,则会出现类似的问题。按默认的字母顺序排序的因子很少能够让人满意.

你可以通过指定levels选项来覆盖默认排序。例如:

各水平的赋值将为1=Poor、2=Improved、3=Excellent。请保证指定的水平与数据中的真实值

相匹配,因为任何在数据中出现而未在参数中列举的数据都将被设为缺失值。数值型变量可以用levels和labels参数来编码成因子。如果男性被编码成1,女性被编码成2,则以下语句

列表(list)是R的数据类型中最为复杂的一种。一般来说,列表就是一些对象(或成分,component)的有序集合

在R中,常见的数据类型一共有5种:

字符型character,

数值型numeric,

整形integer,

复数型complex,

逻辑型logical

还需要注意的是,如果我们直接输入1,2,3,4...得到的是numeric类型。如果想要输入integer类型,需要输入1L,2L,3L,4L...

Inf表示无穷大,-Inf表示无穷小。

同理1/0表示无穷大,-1/0表示无穷小

如果输入0/0则会得到Nan这样的显示,Nan表示在计算的时候出现错误。

而如果出现Na则表示缺失值。我们可以认为Na包含了NaN。

在R语言中,常见的数据的结构有以下几种:

向量,列表,矩阵,数组,数据框,因子

特点:相同类型,序列

如何创建向量?

1、创建初始向量:vector(‘数据类型’,数据个数),例如,我们输入:x<-vector('numeric',10),可以得到如下结果,可以看到x的类型为数值型numeric。

2、用vector其实等同于直接用数据类型后面跟数据个数,上面的例子其实就可以写成numeric(10),运行之后可以得到相同的结果:

3、如果需要创建的向量是等差为1的等差数列,如1到20的数列,我们可以直接写成:

1:20

4、更多情况下,我们用c()函数用来创建向量,把数据对象连结在一起(concatenate)

例如:

c(1,2)

如上图可见,这里的数据类型class显示的是“numeric”,说明c(1,2)生成的向量里面的数据类型是数值型,而非整形integer。如果想要得到整形的向量,我们需要输入:

c(1L,2L)

如果输入c(TRUE,FALSE,FALSE,TRUE),得到逻辑型向量

如果输入c('初中','高中','大学'),得到文本型向量

注意

就像我们之前提到的,向量里面必须得是相同类型的数据。如果在创建向量的时候,输入了不同类型的数据,R会强制将不同类型的数据转换成相同的数据类型。

例如,输入c(1.7,'a'),最后生成的结果如图,1.7被转成了字符型,我们也可以从class里面看到类型是字符型character。

输入c(T,2),最后生成的结果如图,T由逻辑型转成了数值型。

输入c("a",T),得到的结果如图所示,T由逻辑型转成了字符型。

上面提到的这几种转换,通常都是R强制地悄悄地执行的。如果我们自己想要转换数据类型,则应该应用:

as.numeric/logical/character/complex(向量名) 来进行转换。

特点:列表和向量相同的地方在于,二者都是序列;不同的地方在于,列表是由不同类型的对象组成的,而向量则由同样类型的数据组成。

写作:list(name1=object1,name2=object2,…)

例如:输入x<-list(1,'a',T,b=c(1+4i,2-3i)),我们可以明显看到list()里面的每个部分类型都不同(数值,字符,逻辑值,向量),输出结果如图:

是一类特殊向量,维度属性。

matrix(数据, nrow = 几行, ncol = 几列, byrow = FALSE/T是否按行排列, dimnames = list(c(行名),c(列名 )))

斜体的部分表示可以不写。

例如,我们想要输入1-8,2行,4列,按照行排列,行名为张三、王五,列名为吃喝玩乐。可以得到如下图:

matrix(1:8,2,4,byrow=T,dimnames = list(c('张三','王五'),c('吃','喝','玩','乐')))

矩阵还有另外一种方法可以创建,用cbind() rbind()创建

例如有x,y两个向量。cbind()是按照列来连接xy(x一列,y一列)rbind是按照行连接xy(x一行,y一行)

注意 :如果用rbind()来合并矩阵或者向量或者表格,必须要求二者列名一致

矩阵还有另外一种方法可以创建,创建一个向量,而后添加维度

t()表示矩阵的转置

array,和matrix最大的区别在于array的维度更多,有三个维度。

我们可以理解为matrix有行、列两个维度;但是array多了一个面板维度(分成几块)。

array(数据,dim=c(几行,几列,几块),dimnames = list(c(行名),c(列名),c(板块名)))

例如:

array(1:12,dim=c(2,3,2),dimnames=list(c('从前','现在'),c('衣','食','行'),c('北京','上海')))

得到如下结果:

数据框是R的一个重要数据类型,用来存储表格数据。可认为是特殊类型的列表,列表中每个元素(每类)都有同样的长度。每一列可以是不同的类型(矩阵是相同的)。可以通过调用data.matrix()将数据框转化为矩阵。

数据框很像我们在使用SQL的时候来定义表格之后,给表格中的各列赋值的情况。

data.frame(列1=向量,列2=向量)

例如:data.frame(foo=1:4,bar=c(T,T,F,F))

nrow(x)----x有几行

ncol(x)----x有几列

特点:用于创建分类数据,两种类型:有序/无序。

可以写成这样的形式:

factor(c("第一类","第二类","第三类",...),levels=c("第一类","第二类","第三类"),ordered = T)

ordered默认为F。

例如:factor(c("小学","初中","高中","小学"),levels=c("小学","初中","高中"),ordered = T)

得到如下结果:

我们如果不对level进行定义,出现如下结果:

此时虽然有比较,但是初中<高中<小学,这样的结果是根据字母发音排序的结果,或许并不是我们想要的,所以如果我们对排序有要求,还是要对levels进行定义。levels=c("第一类","第二类","第三类"),理解为

"第一类"<"第二类"<"第三类"

我们如果不对ordered进行定义,出现如下结果:

此时为无序数据,无比较。

我们还有另外一种方法来定义因子:gl

gl(有几类, 循环几次, labels = c("第一类名称", "第二类名称"),ordered=T)

例如:gl(2,4),表示有两个变量(2),每一个循环4次

例如:gl(2, 8, labels = c("女", "男"),ordered=T),表示有两个变量,各循环8次,这两个变量分别表示为“女”和“男”,排序。

注意,这里和上一个例子一样,本来应该是给出两个变量用1和2表示,labels相当于给1和2加了“女”和“男”的标签。所以排序之后显示“女”<“男”,其背后真实的情况是1<2 。

例如: gl(2, 8, labels = c("女", "男"),ordered=T,length=32),在以上的基础上,规定一共有32个对象

通过我们以上的论述,我们知道了5种数据类型和几种常见的对象形态。

这些是R中非常基础但是十分重要的内容,需要多看几遍才能记得更清楚。