您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 股票经典资料 > 第四讲R语言语句组循环和条件控制
第四讲:语句组,循环,条件控制事件处理的逻辑模式顺序执行按条件作出是否执行的判断根据某种条件变化反复执行根据不同的情况作出相应的执行一、组合表达式为实现某一功能而使各种命令表达式组合在一起形成一个复合表达式,形式一般为:{expr_1expr_2…expr_n}二、条件控制语句if(condition1)statement1elseif(condition2)statement2elsestatement3condition语句返回一逻辑值,为TRUE时执行,为FALSE时跳过逻辑运算符:&逻辑与||#逻辑或优先对向量的第一个元素进行运算逻辑与|#逻辑或!#逻辑非按照逐个元素的方式进行计算==#恒等#大于=#大于等于#小于=#小于等于x-8if(x=10){x-x+10cat(x=,x,\n)}elseif(x=7){x-x+7cat(x=,x,\n)}else{x-x+5cat(x=,x,\n)}例子:x-8If(0){#condition不为0,执行if(x=10){x-x+10cat(x=,x,\n)}elseif(x=7){x-x+7cat(x=,x,\n)}else{x-x+5cat(x=,x,\n)}}X-1:9#x-paste(c(X,Y),1:10,sep=)If(!is.numeric(x)&&!is.complex(x)&&!is.logical(x)){warning(argumentisnotnumericorlogical:returningNA)return(NA_real_)}例子:例子:分析outer函数的计算过程X-matrix(1:4,nrow=2)Y-array(1:6,dim=c(3,2))X[,1][,2][1,]13[2,]24Y[,1][,2][1,]14[2,]25[3,]36outer(Y,X)#Y%o%X,,1,1[,1][,2][1,]14[2,]25[3,]36,,2,1[,1][,2][1,]28[2,]410[3,]612,,1,2[,1][,2][1,]312[2,]615[3,]918,,2,2[,1][,2][1,]416[2,]820[3,]1224两个数组的外积outer(Y,X,FUN=+),,1,1[,1][,2][1,]25[2,]36[3,]47,,2,1[,1][,2][1,]36[2,]47[3,]58,,1,2[,1][,2][1,]47[2,]58[3,]69,,2,2[,1][,2][1,]58[2,]69[3,]710X[,1][,2][1,]13[2,]24Y[,1][,2][1,]14[2,]25[3,]36可以改变计算函数FUN:+,-,*,/,^outer(X,Y,FUN=“*”):提取两个矩阵的属性outer(X,Y,FUN=“*”):两个矩阵的外积计算过程Vender-paste(c(Vender),1:9,sep=)ProduceName-c(256MBDDR400,256MBDDR333,512MBDDR400,+256MBDDR400,256MBDDR333,256MBSDRAM266,+256MBDDR400,256MBDDR400,512MBDDR400)Type-rep(c(DDR),9)Type[6]-SDRAMMem-c(256,256,512,256,256,256,256,256,512)Frequency-c(400,333,400,400,333,266,400,400,400)Price-c(315,300,650,280,265,265,290,345,575)MemInfo-data.frame(Vender,ProduceName,Type,Mem,Frequency,Price)MemInfoVenderProduceNameTypeMemFrequencyPrice1Vender1256MBDDR400DDR2564003152Vender2256MBDDR333DDR2563333003Vender3512MBDDR400DDR5124006504Vender4256MBDDR400DDR2564002805Vender5256MBDDR333DDR2563332656Vender6256MBSDRAM266SDRAM2562662657Vender7256MBDDR400DDR2564002908Vender8256MBDDR400DDR2564003459Vender9512MBDDR400DDR512400575定义一个数据框rep(expensive,length(MemInfo$Price))-ExpStrrep(cheap,length(MemInfo$Price))-CheapStrifelse(MemInfo$Price300,ExpStr,CheapStr)-PriceDescriptionPriceDescription[1]expensivecheapexpensivecheapcheap“cheap[7]cheapexpensiveexpensiveIfelse(condiction,a,b)#这个表达式返回一个向量,其长度为a,b中的最大长度.当condition[i]为真时返回a[i],否则返回b[i].例子:根据内存的基本数据,我们定义价格大于300的内存的价格为expensive,否则为cheap练习4.1自行设计一个条件控制例子,条件中包含逻辑运算符号&&,||和!三、循环for循环for(nameinstatement){expr}#其中name为循环;statement一般为一向量;expr一般为组合表达式for(ninc(2,5,10,20,50))+{+x-rnorm(n)+cat(n,:,sum(x^2),\n)+}2:0.41241395:5.20287510:13.9651320:20.0769650:58.16209例子例子:定义一个长度为100、mean=1,sd=1的正态分布随机向量,并找出该向量的最小值及其出现的位置norm-rnorm(100,1,1)#随机向量min.norm-100#设定初始最大值for(iin1:100){if(norm[i]=min.norm){min.norm=norm[i]min.count=i}}#第i个值与现有最大值做比较,如果比最大值大则更新最大值,并记录位置,否则不做处理练习4.2找出以上向量的最大值及其出现的位置。找处100次产生的随机向量的最小值于出现位置的关系。(用plot(min.count,min.norm)表示,其中min.count为位置向量,min.norm为最小值向量)norm-rnorm(100,1,1)max.norm--100for(iin1:100){if(norm[i]=max.norm){max.norm=norm[i]max.count=i}}for(jin1:100){min.n-0norm-rnorm(100,1,1)min.norm[j]-100for(iin1:100){if(norm[i]=min.norm[j]){min.norm[j]=norm[i]min.count[j]=i}}}plot(min.count,min.norm)其他循环形式repeat循环repeat{expr#组合表达式break#达到结束循环的条件,跳处循环}while循环while(condition){expr}#while循环中首先执行condition语句,当condition语句的执行结果为TRUE时,执行expr,否则结束循环count-1repeat+{+if(MemInfo$Mem[count]==256)+MemInfo$Price[count]-MemInfo$Price[count]*1.1+count=count+1+if(countlength(MemInfo$Price))+break+}MemInfoVenderProduceNameTypeMemFrequencyPrice1Vender1256MBDDR400DDR256400346.52Vender2256MBDDR333DDR256333330.03Vender3512MBDDR400DDR512400650.04Vender4256MBDDR400DDR256400308.05Vender5256MBDDR333DDR256333291.56Vender6256MBSDRAM266SDRAM256266291.57Vender7256MBDDR400DDR256400319.08Vender8256MBDDR400DDR256400379.59Vender9512MBDDR400DDR512400575.0例子:将容量为256M的内存的价格普调增长10%四、分支控制语句switch(statement,list)#switch语句根据判定条件的不同而执行不同的分支语句。首先执行statement,其返回值范围为1到list的长度。Switch语句执行list中包含的语句,并将结果返回。for(countin1:length(MemInfo$Price)){if(MemInfo$Frequency[count]==266)case-1elseif(MemInfo$Frequency[count]==333)case-2elsecase-3switch(case,{MemInfo$Price[count]-MemInfo$Price[count]*1.1},{MemInfo$Price[count]-MemInfo$Price[count]*1.15},{MemInfo$Price[count]-MemInfo$Price[count]*1.12})}例子:将频率为266,333,400的内存的价格分别增加10%,15%,12%count-1repeat{switch(as.character(MemInfo$Frequency[count]),266=MemInfo$Price[count]-MemInfo$Price[count]*1.1,333=MemInfo$Price[count]-MemInfo$Price[count]*1.15,400=MemInfo$Price[count]-MemInfo$Price[count]*1.12,)count=count+1if(countlength(MemInfo$Price)){break}}switch语句中的statement部分可以直接返回字符型矢量,并根据返回结果做相应处理。练习4.3从小写字母表的前5个中随机抽取一个字母,并按抽取字母的不同做以下操作:a:用apply函数按列来求出datasets包中数据命名为ability.cov的数据列表的第一个元素(cov)的均值b:读取datasets包中命名为beaver1的数据框的第三列中的前25个元素,并求其方差(sd)c:画出datasets包中命名为cars的数组中SpeedandStoppingDistancesofCars的散点图(plot)d:清除控制台中包含“m”字符的对象e:运行demo函数的帮助例子(example)以作业的形式提交本练习的原程序
本文标题:第四讲R语言语句组循环和条件控制
链接地址:https://www.777doc.com/doc-2172052 .html