1、R语言基础与数据科学应用沈刚 主编人民邮电出版社内容导航C O N T E N T S矩阵和数组向量数据框5.15.25.3因子5.4列表5.5数据导入与导出5.6数据清洗5.7用seq()创建向量l seq()函数的一般格式seq(from=1,to=10,by=(to-from)/(length.out-1),length.out=NULL)seq(0,1,length.out=11)1 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 seq(from=0,to=1,by=0.1,length.out=11)Error in seq.default(
2、from=0,to=1,by=0.1,length.out=11):太多参数l from和to指定起始和结束数字,by指定步长,length.out指定输出向量的长度l 同时指定from、to、by和length.out会报错,即使给定参数在数学上是完美的用rep()创建向量l rep()函数的一般格式rep(x,times)x rep(x,3)#向量x重复3次1 3 3 3 3 3 3 3 3 3 rep(1:3,each=2)#注意是元素重复,不是向量重复1 1 1 2 2 3 3l rep(x,times),把向量x重复times次组成新的向量。使用正数索引访问向量元素 my_vec m
3、y_vec 1 1 2 3 4 5 6 7 8 9 10 my_vecc(1,5,7,19)#取给定索引的元素,超出范围会导致NA1 1 5 7 NA my_vec3.141 3l 使用冒号:构造连续的整数向量l 索引也可以是向量l 取超出向量索引的元素会得到NAl 使用浮点数索引会直接截取整数部分作为索引值使用负数索引删除向量元素 my_vec my_vecc(-8,-9,-10)#不显示索引为8,9,10的元素1 2 3 4 5 6 7 8 my_vec-3:-1#元素9,10,11被保留,原数组my_vec未被改动1 5 6 7 8 9 10 11 my_vecc(1,-2)#注意不要正
4、负混用Error in my_vecc(1,-2):only 0s may be mixed with negative subscriptsl R中除引用类型外的对象,在修改时都会在内存中拷贝一个完整的对象进行修改,不会影响原对象的值。l 要修改my_vec向量的元素,可使用赋值的方法。使用逻辑型索引访问向量元素 my_vec my_vecc(T,T,F,T,F)1 1 2 4 my_vec10 length(my_vec)1 10l 使用逻辑型索引会提取向量中索引为TRUE的元素组成新的向量。l 给超出索引范围的元素赋值会使用NA自动填充空余的元素,同时向量长度也会增加往向量中插入元素 m
5、y_vec my_vec my_vec1 1.0 2.0 3.0 3.5 4.0 5.0 6.0 append(my_vec,a,after=3)1 1 2 3 a 3.5 4 5 6l 可使用append函数来完成,也可使用索引和c()函数来手动实现。l 浮点数插入整型向量会将向量转换成浮点型。l 字符元素插入浮点型向量将向量转换成字符型。循环补齐 c(1,2,3)+c(1,2,3,4,5,6,7)#两个向量长度不同,如何相加?1 2 4 6 5 7 9 8Warning message:In c(1,2,3)+c(1,2,3,4,5,6,7):longer object length is
6、 not a multiple of shorter object length#上面的操作等价于下面的语句。c(1,2,3,1,2,3,1)+c(1,2,3,4,5,6,7)1 2 4 6 5 7 9 8l 若长向量长度是短向量整数倍,就不会得到警告信息。向量的比较 c(1,2,3)=c(1,3,2)1 TRUE FALSE FALSE c(1,2,3)c(2,1,3,3,2,1)1 FALSE TRUE FALSE FALSE FALSE TRUE v1-c(1,2,3);v2-c(1,3,2);v3 identical(v1,v2);identical(v1,v3)#判断全等关系1 FA
7、LSE1 TRUE l R中的比较运算符号会将两向量所有索引相等的元素各作一次比较然后输出结果向量。l 比较运算同样依照循环补齐原则l 判断数学意义上的相等关系,需要使用identical()函数向量的比较 0.9+0.2=1.1;1.1-0.2=0.91 TRUE1 FALSE identical(1.1-0.2,0.9)1 FALSE all.equal(v1,v3);all.equal(v1,v2)1 TRUE1 Mean relative difference:0.4 l 计算机处理double型数据会产生误差,使用identical()函数或=运算符可能会得到意想不到的结果l all
8、.equal()函数可避免计算误差导致的异常结果,它还返回比较对象之间差异的描述。向量的比较 v1-1:5;v2 v1 31 FALSE FALSE FALSE TRUE TRUE#v1中是否有大于3的元素;v2中元素是否全小于7 any(v1 3);all(v2 v1 v2 5;v21-3 3 v1*v1 51 TRUE FALSE FALSE FALSE FALSE FALSE TRUE l 运算v1*v1不是矩阵运算。R语言中的“*”号将向量中对应位置的元素相乘组成新向量。l v1*v1 5得到的逻辑型向量作为v1的索引值得到新向量v2。内容导航C O N T E N T S矩阵和数组向
9、量数据框5.15.25.3因子5.4列表5.5数据导入与导出5.6数据清洗5.75.2 矩阵和数组l矩阵(matrix)是一种特殊的向量,矩阵包含两个附加的属性:行数和列数。l矩阵内的元素必须属于同一种基本的数据类型,所以矩阵也有类型的概念。l矩阵是维度限定为2的数组(array)创建矩阵 y dim(y)class(y)1 matrix l 给向量添加维度属性来创建矩阵。创建矩阵l 使用matrix()函数创建矩阵 matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)matrix(c(1,2,3,11,12,13),nrow=2,by
10、row=TRUE,+dimnames=list(c(row1,row2),c(C.1,C.2,C.3)C.1 C.2 C.3row1 1 2 3row2 11 12 13 l 指定行或列维度,R自动计算另一个维度。l byrow默认为FALSE,表示元素按列依次填充。l dimnames给矩阵指定行和列名。创建矩阵 mat1 mat2 mat1 mat2 mat1%*%mat2 ,1,2,31,59 69 792,82 96 1103,105 123 141 mat1*mat2Error in mat1*mat2:non-conformable arrays l 矩阵乘法使用%*%,单独使用*
11、符号会得到矩阵对应索引元素依次相乘的结果。矩阵运算 mat1 ,1,21,1 42,2 53,3 6 c(1,2)*mat1 ,1,21,1 82,4 53,3 12 l 向量与矩阵使用符号*进行运算,会将向量按列循环补齐至与矩阵同维度再进行元素乘法运算。矩阵运算 mat3 solve(mat3)%*%mat3 ,1,21,1 02,0 1 l 矩阵求逆矩阵运算 mat mat.eig mat%*%mat.eig$vectors,1 ,11,-1.6329932,-1.6329933,-3.265986 mat.eig$values1*mat.eig$vectors,11-1.632993-1
12、.632993-3.265986 l 矩阵的特征值与特征向量。l Ax=xl t(mat)#矩阵转置l det(mat)#求方阵行列式l svd(mat)#矩阵奇异值分解apply函数l 基本用法:apply(X,MARGIN,fun)mat apply(mat,1,sum);apply(mat,2,mean)1 12 15 181 2 5 8 l apply()会把一个函数同时作用于一个矩阵中的一个维度,然后把返回值存储在一个向量中。l MARGIN是维度编号,取值为1表示对每一行应用函数,取值为2则表示对每一列应用函数。l 对矩阵mat,按行求和;按列求均值apply函数 f mat f(
13、mat),1,21,0 32,1 43,2 5 apply(mat,1,f),1,2,31,0 1 22,3 4 5 l 自定义apply()函数中的fun参数。l 注意本例中使用apply()函数后得到的矩阵与原始矩阵维度不一致。l 若传入apply中的fun函数的返回值是一个含有n个元素的向量,那么apply()函数执行的结果就有n行。多维数组l 基本用法:array(data=NA,dim=length(data),dimnames=NULL)dim1 dim2 dim3 array(1:12,c(2,3,2),dimnames=list(dim1,dim2,dim3)l 数组结构与矩阵
14、类似,但其维度可以大于2。,semester one Math Chemistry PhysicsTom 1 3 5Bob 2 4 6,semester two Math Chemistry PhysicsTom 7 9 11Bob 8 10 12内容导航C O N T E N T S矩阵和数组向量数据框5.15.25.3因子5.4列表5.5数据导入与导出5.6数据清洗5.75.3 数据框l数据框与矩阵有些相似,但数据框中允许不同的列包含不同类型(数值型、字符型等)的数据。l数据框与数据库中的表十分相似,由一系列等长的向量组成。l数据框也被称为“数据矩阵”或“数据集”。创建数据框 names
15、ages df cbind(df,weight=c(70,73,60)#给数据框添加一列 names ages weight1 Tom 19 702 Ross 18 733 Jerry 20 60 str(rbind(df,list(Bob,23)data.frame:4 obs.of 2 variables:$names:chr Tom Ross Jerry Bob$ages:chr 19 18 20 23 l 与矩阵类似,我们亦可以使用rbind()和cbind()函数来合成数据框。l str()函数查看数据框结构信息。创建数据框 df2 merge(df,df2)names ages h
16、eight1 Jerry 20 1702 Ross 18 1803 Tom 19 176访问数据框中的元素 df2,names ages2 Ross 18 dfages names1 192 183 20 df$ages1 19 18 20l 用索引值或列名来访问数据框中的元素。l 使用dfages得到的结果是数据框。使用mode()查看其类型为list。l 使用df$ages得到的结果是向量。访问数据框中的元素#修改数据框的行名和列名 row.names(df)colnames(df)#显示列名1 names agesl 一般要访问数据框中的行需要用索引,而不能使用dfrowname和$。使
17、用SQL语句查询数据框 library(sqldf)df names agesr1 Tom 19r2 Ross 18r3 Jerry 20 sqldf(select*from df where ages 18)names ages1 Tom 192 Jerry 20l R语言中的数据框与关系型数据库中的表很相似,可用SQL语句对数据框进行一些操作。内容导航C O N T E N T S矩阵和数组向量数据框5.15.25.3因子5.4列表5.5数据导入与导出5.6数据清洗5.7因子 data typeof(data)1 character fac_data as.numeric(fac_data
18、)#以数值型来显示1 1 4 2 4 3 1l 使用factor()函数将向量作为输入来创建因子。l 将因子转换为数值型向量后得到的是向量元素对应的因子水平的编码。这意味着因子中的数据已经重新编码并存储为水平的序号。因子#手动改变因子对象的水平 levels(fac_data)as.numeric(fac_data)1 1 4 2 4 3 1l 手动改变因子变量的levels后,因子变量的打印输出信息发生变化,但转换成数值型向量后的结果未发生变化。因子 fac_datalength(fac_data)+1-southeastWarning message:In fac_data1 East N
19、orth South North West East Levels:East South West North summary(fac_data)East South West North NAs 2 1 1 2 1 l 向因子中添加一个不存在于水平中的元素会产生空值。l summary函数能求出因子各水平出现的频率。内容导航C O N T E N T S矩阵和数组向量数据框5.15.25.3因子5.4列表5.5数据导入与导出5.6数据清洗5.7列表 list_data list_data$fun(list_data2,list_data$num_vec2)1 4 4 2 l 列表是一种更灵活
20、的数据结构,允许其中存在不同类型的对象,甚至是函数对象。l 通过$符号和列表项的名称标签访问列表项目,也可使用索引值。内容导航C O N T E N T S矩阵和数组向量数据框5.15.25.3因子5.4列表5.5数据导入与导出5.6数据清洗5.7数据文件的读写l 例如,当前工作路径下有一名为data.txt的文本文件,内容如下:namesagesGenderAlice18FemaleLucy19FemaleTim20Male stu_info df read.csvfunction(file,header=TRUE,sep=,quote=,dec=.,fill=TRUE,comment.ch
21、ar=,.)read.table(file=file,header=header,sep=sep,quote=quote,dec=dec,fill=fill,comment.char=comment.char,.)数据文件的读写l read.table()函数中的sep参数指定数据文件中分隔符。l csv格式文件的一个广泛应用是在应用程序之间转移数据。stu_info names ages Gender1 Alice 18 Female2 Lucy 19 Female3 Tim 20 Male write.table(stu_info,file=saveData.txt);names ages
22、 Gender1 Alice 18 Female2 Lucy 19 Female3 Tim 20 Male数据文件的读写l write.table将数据写入到文件,file参数指定文件名。library(rio)#载入rio包,若未安装则需先安装 library(datasets)#mtcars数据集在datasets包中 export(mtcars,mtcars.csv)convert(mtcars.csv,mtcars.json)import(mtcars.json)unlink(mtcars.json)#删除mtcars.json文件rio包l rio包中的export函数将数据集写入到
23、文件。R对象文件。l rio包中的convert函数将csv格式文件转换为json格式文件。文件文件。l unlink是base包中函数。aq class(aq)1 data.frame“#若要在原数据框上进行修改并保存,可使用如下语句 fix(aq)#等价于aq#用数据编辑器创建数据框 df v sort(v);order(v)1 1 2 4 5 61 4 1 3 5 2 vorder(v)#与sort(v)得到的结果一致1 1 2 4 5 6l sort()函数输出向量元素排序后的结果。默认为升序排列。l order()函数输出排序后的元素在原向量中的索引。数据排序 df a b y1 5
24、 2 752 2 5 4353 2 4 434 2 9 735 dforder(df$a,-df$b),a b y4 2 9 7352 2 5 4353 2 4 431 5 2 75l 在排序属性前添加负号将其指定为降序排列。l 对数据框中的每一行,依据属性a升序排序,若a相等则按b降序排序。数据清洗l 数据分析工作要求数据必须具有满足统计分析所需要的一致性。记录内的一致性:同一条记录内不能有自相矛盾的信息 记录间的一致性:不同记录的统计属性不能相互冲突 如果用到了多个数据集,可能还会要求数据集之间的一致性。数据需要在所有同一主题的数据集之间保持一致性l 数据清洗的步骤数据一致性检测,发现违反
25、规则的数据。比如,年龄不能为负数,GPA不能超过4.0。挑出造成不一致的变量。修正错误。数据清洗l boxplot.stats()可以得出箱型图统计信息,可查看数据离群点。离群点不一定代表错误,但是发现离群点对于数据分析是很有必要的。x boxplot(x)#绘制箱型图 boxplot.stats(x)$out#显示离群值1 20-8l 第一和第三四分位数(按升序排列时25%的数据分界点和75%的数据分界点)之间的差值叫做四分位距。比第一四分位数小1.5倍四分位距 以上,或比第三四分位数大1.5倍四分位距以上的数据被当作离群点。数据清洗l 缺失值是数据清洗中经常要处理地一种情况,清洗缺失值通常
26、会使用以下几种方法:删除:删除带有缺失值的变量或样本 替换:用均值、中位值、众数 补全:基于统计模型推断出缺失值l 对于某些统计量,可以将缺失值直接排除在外即可。例如求某一组数据的均值:age mean(age)#对存在缺失值的向量求均值会得到NA 1 NA mean(age,na.rm=TRUE)#消除缺失数据对mean函数造成的异常 1 25数据清洗#构造一个带有缺失值的数据框 m d na.omit(d)V1 V2 V3 V4 V54 6 6 6 3 45 4 2 5 1 2 dis.na(d)-0#用0代替缺失值(仅作演示,实际依需求而定)l 若数据集中含有缺失值,一种常见的做法是使用na.omit()函数删除带有缺失值的行。l is.na(d)可得到数据框d中为缺失值的索引,随后按需要对其赋值即可完成对缺失值的替换。