




如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
(word完整版)第四章R编程实践 (word完整版)第四章R编程实践 PAGE\*MERGEFORMAT9 (word完整版)第四章R编程实践 第四章R编程实践 自此,我们已经对R的功能有个全面的了解。一些数据分析都是在R对话窗口(RConsole)中进行的,但对于复杂的数据分析显然是不行方便的。下面将从统计语言和编程角度来说明,我们将会了解一些在R编程实践中采用的简单的概念。 循环和向量化 相比下拉菜单式的程序(R下开发的统计包RCommander),R的一个优势在于它可以把一系列连续的操作简单的程序化.这一点上和所有其他计算机编程语言是一致的,但R有一些特性使得非专业人士也可以很简单的编写程序. 和其他编程语言一样,R有一些和C语言类似的控制结构. (一)控制结构 1。条件语句:条件语句常用于避免除零或负数等数学问题.它有两种形式: 1)if(条件)表达式1else表达式2 2)ifelse(条件,yes,no) 例如: if(x>=0)sqrt(x)elseNA ifelse(x>=0,sqrt(x),NA) 2。循环:有三种形式: 1)for(变量in向量)表达式 2)while(条件)表达式 3)repeat表达式 例如: 假定我们有一个向量x,对于向量x中值为b的元素,我们把0赋给另外一个等长向量y的对应元素,否则赋1。我们首先创建一个与向量x等长的向量y: y〈—numeric(length(x)) for(iin1:length(x))if(x[i]==b)y[i]<-0elsey[i]<-1 几个指令可以放在一个大括弧里面: for(iin1:length(x)){ { y[i]〈-0 … } x<—rnorm(10,—5,0.1) y<-rnorm(10,5,2) X<-cbind(x,y)#矩阵X的列名保持”x”和”y" for(iin1:5/2)z[i]〈—x[i]+y[i] 另外一种可能的情况是当条件为真的时候一条指令才执行: while(myfun>minimum){ … } count〈-0 while(count<10){ print(count) count=count+1 } #如果设置不正确while循环可以能导致无限循环,要小心 #computeEstimate() x0〈-1 tol<—1e-5 repeat{ x1<—rnorm(1,1,2) if(abs(x1—x0)〈tol){ break }else{ x0〈-x1 } } #next,return for(iin1:100){ if(i〈=20){ ##skip next } #dosomthinghere } 3.分支控制语句 switch(statement,list) switch(2,’banana’,’apple’,'other’) num〈—10 mode<-num%%3#模3 cat('modeis',switch(mode+1,0,1,2),'\n’) 例子见“客观赋权法。R". (二)向量化 但是,由于R的一些特性,在很多情况下循环和控制结构可以避免:向量化.向量化使得循环暗含在表达式中,前面的例子中已经多次采用了.比如,两个向量之和: >z〈-x+y 这种加和可以通过循环结构来实现,就像很多编程语言采用的策略一样: >z<—numeric(length(x)) 〉for(iin1:length(z))z[i]<-x[i]+y[i] 在这个例子中,由于要用到向量的下标系统,有必要预先创建一个向量z. 显然,这种显式的循环仅仅用于向量x和y等长的情况:如果不是这样程序代码需要改变,而第一种表达方式在任何情况下都成立(如果对R的向量循环使用方式不了解的话,x和y不等长时要小心一点)。 条件语句(if…else)可以用逻辑索引向量代替;同样上面的例子: 〉y[x==b]〈—0 〉y[x!=b]<—1 除了让代码更简洁,向量化的表达式在计算上效率更高,特别是大数据量的数据集. (三)运用apply等函数 有多个’apply'形式的函数用于避免使用代码的显式循环结构。apply作用于矩阵的行或者/和列,它的语法规则是apply(X,MARGIN,FUN,…),其中X是一个矩阵,MARGIN表明是对行(1)还是列(2),或者二者(c(1,2))进行操作,FUN是一个函数(或操作符,但是这种情况下操作符要在一个括弧里面指定),…是函数FUN可能的参数。一个简单的例子如下。 >x<-rnorm(10,-5,0.1) >y〈-rnorm(10,5,2) >X<-cbind(x,y)#矩阵X的列名保持”x"和"y” 〉apply(X,2,mean) lapply()可以用于一个列表对象:它的语法类似apply并且返回

17****21
实名认证
内容提供者


最近下载