1、第二讲 R语言的基本数据结构NameIDTeam.NumDutyGrade1Grade2Grade3Grade4Grade5Wang N2007091 captainNANANANANATang MJ2007201 memberNANANANANA作业1:按下面表格的形式生成本组信息的数据框,并提交原程序.Name为字符型、ID为数字型、Team.Num为分组因子、Duty为分组因子、Grade1-5为数值型Base:is.thingsBase:recursionGraphics:HersheyGraphics:JapaneseGraphics:graphicsGraphics:imageGr
2、aphics:perspGraphics:plotmathLattice:intervalsLattice:labelsLattice:latticeLattice:panelStats:glm.vrStats:lm.glmStats:nlmStats:smooth作业2:利用sample函数设计算法,把下面16个demo公平地分配给15个组,并提交原程序一、R语言的对象 所有在R语言中可操作的各种数据及各种表达式等都叫R语言的操作对象。对象命名:1、对象的名字必须是以一个字母开头(AZ 或az),中间可以包含字母,数字(09),点(.)及下划线(_);2、R对对象的名字区分大小写;3、避免用
3、R的各种包中的既有对象名来对对象命名:例如,if、for、pi等3、可以通过输入一个对象的名字来显示其内容,例如,一个名为n的对象,其内容是数值10:n 1 10对象的产生、查询及删除1、赋值:name-”Carmen”;n1-10;n2-100;m1ls()ls(pat=“m”)ls.str()/将会展示内存中所有对象的详细信息 3、删除:rm(x)删除内存中所有对象:rm(list=ls()注:ls()函数中的一些选项同样可以运用到 rm中来对象的基本属性 每个对象包含很多基本属性,常用的有对象的类型、存储类型、对象模式、对象长度、对象维度、对象名称等。数值型Numeric 如 100,0
4、,-4.335字符型Character 如“China”逻辑型Logical 如TRUE,FALSE因子型Factor 表示不同类别复数型Complex 如:2+3i对象的类型:mode(object)对象的长度:length(object);fruit names(fruit)mode(fruit)1 numeric length(fruit)1 4对象属性的转换 常用对象转化函数as.character()#转换为字符型as.numeric()#转换为数值型as.logical()#转换为逻辑型plex()#转化为复数型as.factor()#转化为因子型methods(as)#metho
5、ds包中的全部转换函数methods(is)#methods包中全部对象类型判别函数二、数据的创建三、数值向量1、规则序列xxyyx-seq(1,5,by=0.5)#序列的起点、终点、步长 xxrep(1,time=30)#创建一个所有元素都相同的向量sequence(4:5)#创建一系列联系的整数序列 1 1 2 3 4 1 2 3 4 5gl(k,n)/k是水平数,n是每个水平重复的次数,有两个选项:length用来指定产生数据的个数,labels用来指定每个水平因子的名字gl(3,5)gl(3,5.4)#?2、随机序列 R可以产生多种不同分布下的随机数序列。sample(1:40,5)1
6、 25 32 2 35 9sample(c(H,T),10,replace=T)1 H H T H H T H H H H“分布函数的形式rfunc(n,p1,p2,.),其中func指概率分布函数,n为生成数据的个数,p1,p2,.是分布的参数数值。如:rnorm#随机产生正态分布的数据 rnorm(100,2,5)#mean=1,sd=5 随机分布函数rfunc r:random 密度函数dfunc d:density 累计概率密度函数pfunc p:probability 分位数函数qfunc q:quantile 3、分布函数 plot(rnorm(100,2,5)x plot(x,d
7、norm(x),type=l)逻辑向量 逻辑向量包含TRUE、FALSE和NA(not availabe)逻辑向量可以同数值向量一起运算:TRUE=1,FALSE=0 SequenceNum Logicvector2.5 logicvector 错误:找不到对象logicvector Logicvector 1 FALSE FALSE TRUE TRUE c(1:3,NA)-NaData NaData 1 1 2 3 NA NaData8 NaData 1 1 2 3 NA NA NA NA 8 is.na(NaData)1 FALSE FALSE FALSE TRUE TRUE TRUE T
8、RUE FALSE字符向量 可以用两个单引号()或两个双引号(“)去界定字符向量“/”用来识别字符串中包含的()或(“)例子:UserInfor UserInfor1 name users password e-mail“labs labs 1 X1 Y2 X3 Y4 X5 Y6 X7 Y8 X9 Y10 复数向量 z z 1 1.0464457+1.4921546i-0.0857576+0.6500323i-0.4077956+0.7363948i 4 1.2992962+1.0821262i-1.3359859-2.2430534i 1.0756972+1.4531898i 7 1.108
9、4957+0.6604677i 1.2716703+0.4288688i 0.2792403+0.4181003i10-1.0414731-2.2300299i zz zz.shift zz.shift1-0.1-0.9i-0.2-0.8i-0.3-0.7i-0.4-0.6i-0.1-0.5i-0.2-0.4i-0.3-0.3i8-0.4-0.2i-0.1-0.1i五、分组因子 R语言可以将一套数据中相同分类的数据进行分组,所用组别对象称为分组因子 可以用factor()函数生成一个分组因子 分组因子可以方便地对分组数据做相应计算,如:计算平均值、总和或按某种函数形式 例子:factor(sa
10、mple(letters,10,replace=T),levels=letters)1 g b w j c z o d p q Levels:a b c d e f g h i j k l m n o p q r s t u v w x y z六、数组及矩阵 数组是带多个下标的、类型相同的元素的多维数据集合,类型有数值型、字符型、逻辑型、复数型等 矩阵为二维数组 一维数组并不等效为向量 除了类型和长度等基本属性外,数组还有一个特殊属性叫做维数向量,用dim()定义数组定义FirstArray FirstArray 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
11、 17 18 19 20 21 22 23 24 dim(FirstArray)FirstArray#数组的填充规则:越靠前的下标变化越快;#越靠 后的下标变化越慢,1 ,1,2,3,41,1 4 7 102,2 5 8 113,3 6 9 12,2 ,1,2,3,41,13 16 19 222,14 17 20 233,15 18 21 24#等价于 FirstArrayPrices Prices 64M 128M 256Mvender1 20 22 76vender2 24 56 87 Prices,c(“64M”,“256M”)#通过维名访问数组 64M 256Mvender1 20 7
12、6vender2 24 87向量,数组的混合运算规则:1、表达式中各元素匹配时,总是从左到右。2、在进行计算时比较短的向量会扩展数据以适应最大数量元素的操作数。扩展数据的基本规则为循环地从第一个元素开始填充所需要的数据。3、所有的数组必须具有相同的dim属性,否则返回一个错误。4、任何一个向量的操作结果的长度大于数组间操作结果的长度时,R语言会产生错误。5、如果数组间操作无误,那么计算结果也是一个相同维度的数组。a1 a2 a1 ,1,2,31,1 5 92,2 6 103,3 7 114,4 8 12 a2 ,1,2,31,1 4 72,2 5 83,3 6 9 a1+a2错误于a1+a2:
13、非整合陈列 a2 a2 ,1,2,31,1 5 92,2 6 13,3 7 24,4 8 3 a1+a2 ,1,2,31,2 10 182,4 12 113,6 14 134,8 16 15 a1*a2 ,1,2,31,1 25 812,4 36 103,9 49 224,16 64 36不同dim属性相同dim属性不同dim属性相同dim属性 a3 a3 ,1,2,31,1 2 3 a2+a3错误于a2+a3:非整合陈列一维数组并不等效为向量 a4 a41 1 2 3 a4+a2 ,1,2,31,2 7 122,4 9 23,6 8 44,5 10 6向量与数组运算 a5 a4+a51 2
14、4 6 5 7 9 8警告信息:In a4+a5:长的对象长度不是短的对象长度的整倍数不同长度的向量运算 a6 a6+a2错误:dims product 12与对象长度13不匹配此外:警告信息:In a6+a2:长的对象长度不是短的对象长度的整倍数 a7 a7+a2错误:dims product 12与对象长度24不匹配一维数组并不等效为向量不同长度的向量运算两个数组的外积 A B A ,1,21,1 32,2 4 B ,1,2,3,41,1 4 7 102,2 5 8 113,3 6 9 12 B%o%A,1,1 ,1,2,3,41,1 4 7 102,2 5 8 113,3 6 9 12,
15、2,1 ,1,2,3,41,2 8 14 202,4 10 16 223,6 12 18 24,1,2 ,1,2,3,41,3 12 21 302,6 15 24 333,9 18 27 36,2,2 ,1,2,3,41,4 16 28 402,8 20 32 443,12 24 36 48 AB x x ,1,2,31,1 3 52,2 4 6 xt xt ,1,21,1 22,3 43,5 6 x x,1 ,1,2,31,1 3 52,2 4 6,2 ,1,2,31,7 9 112,8 10 12,3 ,1,2,31,13 15 172,14 16 18,4 ,1,2,31,19 21 2
16、32,20 22 24 xt xt,1 ,1,21,1 22,3 43,5 6,2 ,1,21,7 82,9 103,11 12,3 ,1,21,13 142,15 163,17 18,4 ,1,21,19 202,21 223,23 24七、矩阵#nrow定义行数,ncol定义列数,dimnames定义行和列的名称,byrow定义矩阵的填充顺序,为T时按行填充,为F时按列填充mdat mdat C.1 C.2 C.3row1 1 2 3row2 11 12 13 t(mdat)row1 row2C.1 1 11C.2 2 12C.3 3 13 xt xt row1 row2C.1 1 11C
17、.2 2 12C.3 3 13转置转置 t(mdat)row1 row2C.1 1 11C.2 2 12C.3 3 13 xt xt row1 row2C.1 1 11C.2 2 12C.3 3 13转置转置 a1 a2 a1 ,1,2,31,1 3 52,2 4 6 a2 ,1,2,31,1 4 72,2 5 83,3 6 9 a1%*%a2 ,1,2,31,22 49 762,28 64 100 a1%*%a1错误于a1%*%a1:非整合参数 a2%*%a1错误于a2%*%a1:非整合参数两个矩阵内积 Coefficient Result solve(Coefficient,Result)
18、#sovle()返回线性方程组行列式结果1 2-3#a=2,b=-3求解线性方程组:3a-2b=122a+b=1 solve(Coefficient)#求矩阵Coefficient的逆 ,1 ,21,0.1428571 0.28571432,-0.2857143 0.4285714矩阵计算函数矩阵计算函数练习2.1熟练掌握矩阵计算的有关函数数组矩阵合并 函数rbind()把参数变量按行拼成一个大矩阵,两个数组(或向量)的列数必须相等 函数cbind()把参数变量按列拼成一个大矩阵,两个数组(或向量)的行数必须相等 a1 a2 a1 ,1,2,31,1 3 52,2 4 6 a2 ,1,2,31
19、,1 4 72,2 5 83,3 6 9 rbind(a1,a2),1,2,31,1 3 52,2 4 63,1 4 74,2 5 85,3 6 9 cbind(a1,a2)错误于cbind(a1,a2):矩阵的行数必需相符(见arg2)t(a1),1,21,1 22,3 43,5 6 a1 cbind(a1,a2),1,2,3,4,51,1 2 1 4 72,3 4 2 5 83,5 6 3 6 9八、数据分割与选取 向量索引向量索引Xn#第n个元素X-n#除了第n个元素外的XX1:n#前n个元素X-(1:n)#第n+1至最后的元素Xc(1,4,2)#指定下标的元素X“name”#名为nam
20、e的元素XX3#所有大于3的元素XX3&X X names(X)Xa b c d e f g h i 1 2 3 4 5 6 7 8 9 X6f 6 X2:6b c d e f 2 3 4 5 6 X-3a b d e f g h i 1 2 4 5 6 7 8 9 X-(5:9)a b c d 1 2 3 4 X-c(5,9,2)a c d f g h 1 3 4 6 7 8 XX5f g h i 6 7 8 9 XX5&X Xc(c,g,d)c g d 3 7 4 XX%in%letters5:13named integer(0)XX%in%5:13e f g h i 5 6 7 8 9
21、sstr sstrsstr%in%c(letters,LETTERS)1 c B c a例子 Xi,j#下标为(i,j)的元素 Xi,#第i列 X,j#第j列 X,c(1,3)#第1,3列 X“name”,#名为”name”的行数组具有类似的数据分割与选取方法数组具有类似的数据分割与选取方法矩阵索引练习2.2 熟练掌握数据分割与选取的方法 X X D E F Ga 1 2 3 4b 5 6 7 8c 9 10 11 12 X2,31 7 X2,D E F G 5 6 7 8 X,4 a b c 4 8 12 X,c(1,3)D Fa 1 3b 5 7c 9 11 Xa,D E F G 1 2
22、3 4 九、数据列表 数据列表(list)是一组数据元素的集合,这些数据元素可以是不同的数据结构(dim属性,数据类型等)list()函数可以组合任意对象 FamilyInfo FamilyInfo$hostname1 joe$wife1 rose$no.children1 3$child.ages1 1 3 7 FamilyInfo$wife#通过元素的名字来访问1 rose“FamilyInfo3#通过元素的编号来访问$no.children1 3 FamilyInfo31 3例子数据列表操作 长度扩展 length(FamilyInfo)1 4 FamilyInfo5 FamilyInf
23、o$hostname1 joe$wife1 rose$no.children1 3$child.ages1 1 3 751 10th F,HongXing Building,No.100,JainYe Road数据列表合并 FamilyBirthday c(FamilyInfo,FamilyBirthday)-Family#函数c()可以连接数据列表 Family$hostname1 joe$wife1 rose$no.children1 3$child.ages1 1 3 751 10th F,HongXing Building,No.100,JainYe Road$hostbirthday
24、1 1979/10/08$wifebirthday1 1973/07/09 数据框(data frame)是一个属于data.frame 类的列表。不过,对于可能属于数据框的列表对象有下面一些限制条件,1、分量必须是向量(数值,字符,逻辑),因子,数值矩阵,列表或者其他数据框;2、矩阵,列表和数据框为新的数据框提供了尽可能多的变量,因为它们各自拥有列,元素或者变量;3、数值向量,逻辑值,因子保持原有格式,而字符向量会被强制转换成因子并且它的水平就是向量中出现的独立值;4、在数据框中以变量形式出现的向量结构必须长度一致,矩阵结构必须有一样的行数.数据框常常会被看作是一个由不同模式和属性的列构成的
25、矩阵。它能以矩阵形式出现,行列可以通过矩阵的索引习惯访问。十、数据框创建数据框 L3 d d x y fac1 1 1 C2 1 2 A3 1 3 B4 1 4 C5 1 5 A6 1 6 B7 1 7 B8 1 8 B9 1 9 B10 1 10 A d1 x1 12 13 14 15 16 17 18 19 110 1 d1 1 1 1 1 1 1 1 1 1 1 1 mode(d1)1 list mode(d1)1 numeric length(d1)1 1 length(d1)1 10 d231 3d d x y fac HT1 1 1 B T2 1 2 A H3 1 3 B H4 1
26、 4 A T5 1 5 C T6 1 6 A T7 1 7 B H8 1 8 C T9 1 9 C H10 1 10 A T rbind(class=sapply(d,class),mode=sapply(d,mode)x y fac HT class numeric numeric factor factor mode numeric numeric numeric numeric d d x y fac HT1 1 1 A H2 1 2 A T3 1 3 C T4 1 4 A T5 1 5 B H6 1 6 C H7 1 7 C T8 1 8 A H9 1 9 A T10 1 10 C H
27、 rbind(class=sapply(d,class),mode=sapply(d,mode)x y fac HT class numeric numeric AsIs factor mode numeric numeric character numeric d3 1 A A C A B C C A A C d4 1 H T T T H H T H T HLevels:H T函数I():Change the class of an object to indicate that it should be treated as is 十一、数据运算练习2.3 熟练掌握数据运算的有关符号和函数
28、十二、数据的选择与操作十三、高级数据处理 对于向量,可以用函数直接对其进行计算 对于数组和矩阵,如果需要对其中一维(或若干维)进行某种计算时,则可以用apply()函数自定义数组的操作.apply(X,MARGIN,FUN,)#X给定数组,MARGIN指定维数,FUN自定义计算函数。#FUN为R自带包中的函数 X X ,1,2,3,4,5,61,1 5 9 13 17 212,2 6 10 14 18 223,3 7 11 15 19 234,4 8 12 16 20 24 apply(X,MARGIN=1,sum)1 66 72 78 84 apply(X,MARGIN=2,sum)1 10
29、 26 42 58 74 90#FUN为自定义函数 f ffunction(V)d=sd(V)/mean(V);return(d);apply(X,MARGIN=2,f)1 0.51639778 0.19861453 0.12295185 0.08903410 0.06978348 0.05737753 apply(X,MARGIN=1,f)1 0.6803013 0.6236096 0.5756396 0.5345225例子 lapply(X,FUN)#应用FUN到列表X的每个元素 tapply(X,INDEX,FUN)#根据X的索引(INDEX)对不完全的数列应用FUN sapply()#同lapply