第一课R中的数据结构三.Dataobjects3.1向量my1-c(1.2,2.3,3.5,4.6,5.7)#-为赋值语句,c:concatenatemy2-c(Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday)my3-vector(logical,3)#生成长为3的逻辑向量my4-numeric(4);#生成长为4的数值型变量my5-complex(5);#生成长为5的复数值向量my6-character(6)#生成长为6的字符型向量#scan函数my7-scan()#键盘输入数值型变量my8-scan(what=””)#键盘输入字符型变量#产生特定序列的函数rep(NA,5)#生成长为5的元素均为NA的向量rep(c(T,T,F),2)rep(c(yes,no),c(4,2))1:5#:R的函数,生成增幅为1或-1的序列1.2:41:-1seq(-pi,pi,.5)seq(-pi,pi,length=10)seq(1,by=.05,length=10)#what’sthedifferencebetweenmat1andmat2?mat1-rep(1:4,rep(3,4))mat2-rep(1:4,3)numbered.letters-lettersnames(numbered.letters)-paste(“obs”,1:26,sep=””)#给向量元素加名字#向量间的运算2+3c(1,2,3)+c(4,5,6)#对应元素相加c(1,2,3)*c(4,5,6)#对应元素相乘c(1,2,3)%*%c(4,5,6)#矩阵相乘c(1,2,3)/c(4,5,6)#对应元素相除1:10+6#将6加到1:10序列的每个元素上1:10+c(100,200)#重复使用c(100,200)中的值(1:10)^2#^是幂次运算1:10^2#^运算比:运算优先#向量的逻辑比较x-rnorm(10)#产生服从标准正态分布的10个随机数x=2.5x-2:5x==3sum(x==3)#将逻辑值true转化为1,false转化为0#NA与NULLNA:notavailableNULL:空x-c(88,NA,12,168,13)mean(x)mean(x,na.rm=T)#na.rm意思为NAromovemean(x[!is.na(x)])#NA有不同的modex-c(5,NA,12)mode(x[1])#mode一个object的类型mode(x[2])y-c(abc,def,NA)mode(y[2])mode(y[3])spring-faithfulspring[1,1]-NAapply(spring,2,mean,na.rm=T)#NULL在向量中的作用x-c(88,NULL,12,168,13)mean(x)length(x)#NULL经常被用于在循环中建立向量z-NULLfor(iin1:10)if(i%%2==0)z-c(z,i)z#数据的运算中很重要的一项是数据的提取(subsetting)#数据提取的最基本的途径是通过indexing(指标)#方括号的使用#indexingvectors:x[index]#indexcanbe:一个正整数的向量:取出由正整数向量所代表的位置上的元素一个逻辑向量:取出由逻辑向量中取值TRUE的分量所代表的位置上的元素一个负整数的向量:去掉由负整数向量所代表的位置上的元素一个字符型向量:由向量分量的名字来取出分量空集:取出全体元素myseq-1:100myseq[1:5]#取出第一到第五个元素myseq[rep(2,5)]myseq[c(1,20,45)]my=c(1,4,7,8,9)my[-c(3,5)]#去掉第三和第五列myseq=seq(1,by=3,length=20)myseq=30#一个逻辑值向量myseq[myseq=30]#给出myseq里大于等于30的所有值x-c(1.9,3.0,4.1,2.6,3.6,2.3,2.8,3.2,6.6,7.6,7.4,1.0)x[x2]x[x2&x4]x[c(F,F,T)]char=c(monday,tuesday,wednesday,thursday,friday)names(char)=c(v1,v2,v3,v4,v5)char[v1]#取出名为v1的元素char[c(v1,v5)]#取出名为v1和v5的元素char[]#取出所有元素char[8]#指标出界longitude-state.center$xnames(longitude)-state.namelongitude[c(Hawaii,Alaska)]#向量的重要属性:length,mode,names#产生均值为3,标准差为2的正态分布的20个随机数x-rnorm(20,mean=3,sd=2)names(x)=paste(obs,1:20,sep=)#给向量加名字length(x)#给出向量的长度mode(x)#给出向量的类型names(x)#给出向量分量的名字3.2矩阵#生成矩阵的方式:matrix函数mat1-matrix(1:12,ncol=3,byrow=T)#给矩阵的行和列加名字dimnames(mat1)=list(c(row1,row2,row3,row4),c(col1,col2,col3))#可以直接在matrix语句里加名字mat2-matrix(1:12,nrow=3,dimnames=list(NULL,paste(col,1:4)))y-matrix(nrow=2,ncol=3)#元素为NA的2x3的矩阵y[1,1]-1y[1,2]-2y[2,1]=3#=和-的作用几乎是一样的y[2,2]=4#生成矩阵的方式:dim语句mat-rep(1:4,rep(3,4))dim(mat)-c(3,4)#给一个向量赋予维数就成为矩阵dimnames(mat)-list(paste(row,letters[1:3]),paste(col,LETTERS[1:4]))#生成矩阵的方式:rbind,cbind语句mat-rbind(c(200688,24,33),c(201083,27,115))#rbind可以将若干个向量合为一个矩阵dim(mat)#查看矩阵的维数mat-cbind(c(200688,24,33),c(201083,27,115))dim(mat)#矩阵的subsettingJ=matrix(c(12,15,6,10,2,9,2,7,19,14,11,19),nrow=3,byrow=TRUE)J[9]#在R中矩阵本质上是一个向量。按列数,取第九个元素J[c(1,3),c(2,4)]#取第1,3行和2,4列交叉的4个元素J[,c(2,4)]#取第2,4列的所有元素J[-1,c(2,4)]#去掉第1行,然后取第2,4列的所有元素J[1,3,drop=F]#drop=F的选项使得取出的元素保持矩阵的形式m-matrix(1:6,nrow=3)m[m[,1]2&m[,2]3,]#矩阵的重要属性:length,dim,mode,dimnames(rownames,colnames)m-matrix(1:12,ncol=3,byrow=T,dimnames=list(c(row1,row2,row3,row4),c(col1,col2,col3)))length(m)#作为一个向量dim(m)#作为一个矩阵mode(m)#m中元素的类型dimnames(m)rownames(m)colnames(m)3.3高维数组(array)array(c(1:8,11:18,111:118),dim=c(2,4,3))3.4list例一:datairis的属性attributes(iris)#attributes给出一个object的属性的集合例二:grp-c(rep(1,11),rep(2,10))thw-c(450,760,325,495,285,450,460,375,310,245,350,340,300,310,270,300,360,405,290)heart.list-list(grp,thw,heartdata)#生成list时各分量没有名字heart.list-list(group=grp,thw=thw,descrip=heartdata)#生成list时各分量加上名字names(heart.list)#查看list各分量的名字names(heart.list)-c(group,totalheartweight,descrip)#加名字#当list有元素名时,提取数据的最主要的方式为$mylist-list(one=c(1,2,3),two=c(a,b,c,d),three=1:10)mylist$twomylist$two[5]#mylist的第2个元素的第5个分量mylist$o#可以只用list元素名的一部分,只要可以区分就行mylist$twmylist$th#如果一个list的元素没有名字,可用[]提取元素first-mylist[1]#R中的每个object都有一个modemode(1:10)mode(matrix(0))mode(vector(complex,5))mode(letters)mode(data.frame(0))mode(mean)#由[]提取的list有一个问题:数据保持原数据的modemode(mylist)mode(first)#解决这个问题的方法是用[[]]。这样提取的元素具有这个元素本身的modemylist[[1]]mode(mylist[[1]])3.5dataframescars=read.table(D:/93cars.txt,header=TRUE)#read.tabl:读入外部数据的主要函数class(cars)#由read.table读入的数据自动成为一个dataframecars1=as.matrix(cars)#如果将其转化为矩阵,则数据会变得很难看cars1a=1:9b=letters[1:9]classlist-c(male,female,male,male,male,female,male,male,male)classlist=factor(classlist)all=data.frame(a,b,classlist)#由指令data.frame生成一个dataframe#由于dataframe本质上是一个list,因此其提取元素的方法与list相同#又由于其具有矩阵的结构,因此也可以用矩阵的方法提取数据a-all$classlistb-all[c(1,2),c(1,3)]#dataframe各列保持其原有的属性my.logical-sample(c(T,F),size=20,replace=T)my.complex-rnorm(20)+runif(20)*1imy.numeric-rnorm(20)my.matrix-matrix(rnorm(40),ncol=2)my.df1=cbind(my.logical,my.complex,my.numeric,my.matrix)#是一个矩阵my.df=data.frame(my.logical,my.complex,my.numeric,my.matrix)#要用指令data.frameis.logical(my.df$my.logical)is.vector(my.df[,5])#生成dataframe要注意的问题kids-c(Jack,Jill)ages-c(12,10)d-data.frame(kids,ages)d$kids#是个属性变量,不是我们想要的d-data.frame(kids,age