R语言-数据结构

来源:互联网 发布:不吃乐乎什么意思 编辑:程序博客网 时间:2024/05/17 21:39

一、R中的数据类型

R中的数据类型有
标量、向量、矩阵、数组、数据框和列表


二、标量和向量

向量是用于储存数值型、字符型(含字符串 )或逻辑型数据的一维数组,通过函数c()进行创建。如:

a<-c(1,2,3)b<-c("one","two","three")c<-c(TRUE,FALSE,FALSE)d<-c(2:6)   #产生从2-6的数组

标量则是只含一个元素的向量,如e<-2
我们可以通过方括号[]访问向量指定位置的元素,如:

> a[3]   #直接指定某一个位置[1] 3> d[1:2]  #指定位置区间[1] 2 3> b[c(1,3)] #指定某几个位置,位置通过c()函数拼接[1] "one"   "three"

向量可以通过c()添加新元素,通过c[-序号]的方式删除元素


三、矩阵

矩阵是一个二维数组,只是每个元素都是相同的数据类型(数值型、字符型或逻辑型),通过函数matrix()创建,形如:

mymatrix<-matrix(vector, nrow =number_of_rows, ncol                   =number_of_colums, byrow =logical_value,                dimnames =list(char_vector_rownames,                char_vector_colnames))           

其中vector是以向量形式给出的矩阵数据,nrow和ncol分别是行和列的维数,dimnames可选,是以字符型向量给出的行和列的名称。选项byrow表示矩阵按行填充(byrow=True)还是按列填充(byrow=False),默认按列填充,具体如下:

> mt1=matrix(1:20,5,4)  #byrow=FALSE构造5*4矩阵> mt1     [,1] [,2] [,3] [,4][1,]    1    6   11   16[2,]    2    7   12   17[3,]    3    8   13   18[4,]    4    9   14   19[5,]    5   10   15   20> rnames=c("R1","R2");cname=c("C1","C2")> #byrow=True构造2*2矩阵(含行、列名)> mt2=matrix(cells,nrow = 2,ncol = 2,byrow = TRUE,dimnames = list(rnames,cnames))> mt2   C1 C2R1  1 26R2 24 68

同样通过方括号[]来选择指定位置的元素,具体如下:

> mt1[1,]      #获取mt1第1行[1]  1  6 11 16> mt1[,1]      #获取mt1第1列[1] 1 2 3 4 5> mt1[1,1]     #获取mt第1行第1列的元素[1] 1> mt1[1:2,1]   #获取mt第1列,第1-2个元素[1] 1 2> mt1[1:2,1:2] #获取mt1第1-2行,第1-2列的元素     [,1] [,2][1,]    1    6[2,]    2    7

四、数组

数组是矩阵的自然推广,维度可以大于2,但元素依旧只能是一种数据类型,通过函数array()创建,形如:
myarray<-array(vector,dimensions,dimnames)
其中vector是以向量形式给出的数组数据,dimensions是一个数值型向量,用以表示各维度大小,dimnames可选,是各维度名称的列表,如:

dim1<-c("A1","A2") dim2<-c("B1","B2","B3")dim3<-c("C1","C2","C3","C4")#构造2*3*3的数组array1<-array(1:24,c(2,3,4),dimnames = list(dim1,dim2,dim3))

元素选择同矩阵,此处不再赘述


五、数据框

数据框不同列可以包含不同数据类型,因此更为通用,类似其它软件中的数据集的概念。可以通过函数data.frame()创建,形如:
mydata<-data.frame(col1,col2,col3…)
其中col为各列数据,可以为任何数据类型,具体如下:

> age<-c(25,34,28,52)> diabetes<-c("Type1","Type2","Type1","Type1")> status<-c("Poor","Improved","Excellent","Poor")> patientdata<-data.frame(patientID,age,diabetes,status)> patientdata  patientID age diabetes    status1         1  25    Type1      Poor2         2  34    Type2  Improved3         3  28    Type1 Excellent4         4  52    Type1      Poor

可以通过方括号[]或者指定列名的方式获得元素,具体如下:

> patientdata[1:2] #默认按列选  patientID age1         1  252         2  343         3  284         4  52> patientdata[c("diabetes","status")] #获得指定列  diabetes    status1    Type1      Poor2    Type2  Improved3    Type1 Excellent4    Type1      Poor> table(patientdata$age,patientdata$status) #组成列联表     Excellent Improved Poor  25         0        0    1  28         1        0    0  34         0        1    0  52         0        0    1

如上可以通过$来选择某一列(变量),但每次都输入很麻烦,因此可以通过attach()+detach()或单独使用with()来简化代码。

  • attach()+detach()
    attach()可以将数据框加入R的搜索路径中,方便在该数据框中定位某变量,之后需要用detach()将数据框移除。但是,该步骤不会对数据框本身有影响,detach()也可以省略。如:
attach(patientdata)agedetach()

但如果存在多个同名变量时,原始对象会取得优先级,如:

> age<-c(1,2,3,4)> attach(patientdata)The following objects are masked _by_ .GlobalEnv:    age, diabetes, patientID, status> age[1] 1 2 3 4> detach()
  • with()
    通过形如with(X, { })的形式将{}内的语句在X数据框下进行(若只有一行语句,可省略{}),但此时赋值语句只在with()内部生效,如果想创建with()之外的对象,需要使用特殊赋值符号<<-实现,具体如下:
> with(patientdata,{myage<-age ;myage})[1] 25 34 28 52> myageError: object 'myage' not found> with(patientdata,{myage<<-age})> myage[1] 25 34 28 52

在patientdata中,patientID可用于区分个体,R中可通过形如row.names = patientID指定实例标识符(case identifier)。
注意:无论是在attach还是with下即使对原数据进行了修改,如果直接使用字段名,获取到的仍是未修改前的结果。如果需要使用修改后的数据,则需要再次attach或者with

因子
如patientdata中所显示的,变量可归结为名义型(类别型)、有序型或连续型。名义型无顺序之分(如Diabetes),有序型有顺序之分,但不清楚差值(如Status),连续型则同时表示了顺序和数量(如age)
其中名义型和有序型变量在R中称为因子(factor)。因子在R中非常重要,因为它决定了数据的分析方式和视觉呈现。
函数factor()可以将原始字符串组成的内部向量映射到一系列整数上,具体来说:
通过diabetes<-factor(diabetes)该向量将被映射为(1,2,1,1)。为表示有序向量,则需要指定参数ordered=True,通过status<-factor(status,ordered = TRUE)此向量将被映射为(3,2,1,3)。以上有关字符型向量的水平默认按照字母顺序创建,因此很难让人满意,此时可以通过level选项来覆盖默认排序,形如

> status<-factor(status,ordered = TRUE,levels=c("Poor","Improved","Excellent"))> patientdata=data.frame(patientID,age,diabetes,status)> str(patientdata)'data.frame':   4 obs. of  4 variables: $ patientID: num  1 2 3 4 $ age      : num  1 2 3 4 $ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1 $ status   : Ord.factor w/ 3 levels "Poor"<"Improved"<..: 1 2 3 1> summary(patientdata)   patientID         age        diabetes       status  Min.   :1.00   Min.   :1.00   Type1:3   Poor     :2   1st Qu.:1.75   1st Qu.:1.75   Type2:1   Improved :1   Median :2.50   Median :2.50             Excellent:1   Mean   :2.50   Mean   :2.50                           3rd Qu.:3.25   3rd Qu.:3.25                           Max.   :4.00   Max.   :4.00    

通过str(patientdata)我们可以清除的看到数据框的信息,summary()则会根据不同数据类型进行处理。

矩阵和矩阵都可以通过rbind()增加一行,或cbind()增加一列,通过类似向量的方法删除元素


六、列表

列表(list)是R中最复杂的一种数据类型,可以包含其他给类对象(含list),可以通过函数list()创建,形如:
mylist<-list(object1,object2…)
具体使用如下:

> mylist=list("it is my list",ages=age,patientID)> mylist[[1]][1] "it is my list"$ages  #等价于[[2]]只是赋予了名称[1] 25 34 28 52[[3]][1] 1 2 3 4#指定序号和名称效果一样> mylist[[2]][1] 25 34 28 52> mylist[["ages"]][1] 25 34 28 52> mylist[2] $ages [1] 25 34 28 52

需要注意的是列表也可以使用单括号获取元素,但这样的结果是一个更小的列表.而是用双中括号[ [ ] ]与$一样都是获得元素本身。

列表的元素添加和向量一眼使用c(),但需要注意的是列表的每一个元素都是列表,因此添加元素之前需要先以list包装一下,否则结果可能不太理想,而且也不适合用list进行元素添加。

> test<-list(c1=c(1:2))> test<-c(test,c2=c(1:2))  #未包装> test$c1[1] 1 2$c21[1] 1$c22[1] 2> test<-list(c1=c(1:2))> test<-c(test,list(c2=c(1:2)))   #包装后> test$c1[1] 1 2$c2[1] 1 2> test<-list(c1=c(1:2))     #使用list添加元素> test<-list(test,list(c2=c(1:2)))> test[[1]][[1]]$c1[1] 1 2[[2]][[2]]$c2[1] 1 2

如果要删除元素,只需要令某一位置为NULL即可