分享

30 天学会R DAY 11:条件和循环语句的应用

 妙趣横生统计学 2019-12-08

第11天 条件、循环语句的应用

在所有计算机语言中,条件和循环语句占据着极其重要的地位,在统计软件比如SAS,条件语句在数据整理中的地位也举足轻重。R语言高级编程,条件和循环语句也类似如此。作为初级教程,今天我们就两语句在数据整理做简单的介绍。

一、条件语句

条件语句,最常见的是 if语句。If语句常见的形式有简单的ifelse 语句 和复杂的if –else if-else语句

1. ifelse 语句

ifelse语句一般可以将变量进行二分类化。

· 向量的if语句使用

> x <- 1:10

> y <- ifelse(x>5,2, 1) # 当x>5时设定y为2,否则y为1

> y

[1] 1 1 1 1 1 2 2 2 2 2

· 数据框中if语句的使用

> z<-data.frame(v1=1:5,v2=6:10,v3=11:15)  #产生数据框

> z

 v1 v2 v3

1  1  6 11

2  2  7 12

3  3  8 13

4  4  9 14

5  5 10 15

> y <- ifelse(z$v1>2, 0, 10) #对数据框中的v1变量进行二分类处理

> y

[1] 10 10  0  0  0

> z$y<-ifelse(z$v1>2, 0, 10) #在原数据框中增加y这一变量

> z

 v1 v2 v3  y

1  1  6 11 10

2  2  7 12 10

3  3  8 13  0

4  4  9 14  0

5  5 10 15  0

2. 复杂的if –else if-else语句

复杂的if语句一般与else if 和else连用,整个语句的方式是if (conditon1) {expr1} else if (conditon1){expr2} else{expr3}

翻译成中文是这样的:

if (条件1) {条件1符合的调用表达式1} else if (条件2){条件1符合的调用表达式2} else{条件1和条件2都不成立调用表达式3}

当使用if,else if, else语句时要注意几点:

1)if语句可以有零个或一个else,但如果有else if语句,那么else语句必须在else if语句之后。

2)if语句可以有零或多else if语句,else if语句必须放在else语句之前。

3)当有一个else if条件测试成功,其余的else...if或else将不会被测试。

· 简单的if语句:对一个score值进行判断!

score <- 89

 if( score>=0 & score<60){print("不及格")} else {print("成绩及格") }

这样的形式很难看,一般我们会在编写表达式时进行换行处理,并将表达式缩进:

score <- 89

if( score>=0 & score<60){      #条件1

print("不及格")              #表达式1  

} else {                                  #不满足条件1的情况

print("成绩及格")          #表达式2  

}

可以发现,大括号一头一尾不会在同一行,甚至间隔一行,而同一行却出现上一个大括号括号和下一个大括号头括号在一行的现象。这是if语句常见的编程格式。

  • if,else if, else一起使用

score <- 89

if( score>=0 & score<60) {

print("不及格")

} else if(score < 70){

print("及格")

} else if(score < 80){

print("中等")

} else if(score < 90){

print("良好")

} else if(score <= 100){

print("优秀")  

} else{  

print("成绩不合理")

}

· If语句无法处理向量的多变量值的情况

对于多记录的情况,if语句没法完成,不像SAS一样。

> if( z$v1<3) {

+   z$v4<-1

+ }else if(z$v1 < 4) {

+   z$v4<- 2    

+ }else{

+   z$v4<-3

+ }

Warning message:

In if (z$v1 < 3) { :

 the condition has length > 1 and only the first element will be used

> z

 v1 v2 v3  y v4

1  1  6 11 10  1

2  2  7 12 10  1

3  3  8 13  0  1

4  4  9 14  0  1

5  5 10 15  0  1

对于多记录,需要结合循环语句

当使用if,else if, else语句时要注意几点:

1)if语句可以有零个或一个else,但如果有else if语句,那么else语句必须在else if语句之后。

2)if语句可以有零或多else if语句,else if语句必须放在else语句之前。

3)当有一个else if条件测试成功,其余的else...if或else将不会被测试。

二、  循环语句

1. 循环语句

循环语句最长常见的是for循环,此外还有while循环,repeat循环。本次内容以for 循环为例进行讲解。

For循环的格式:

for(var in seq) { expr }  #和if语句情况相似。

其中,var为循环变量;seq为向量表达式,通常是一个序列。Seq语句可以是1:length(),或者seq_along语句。其执行过程为,每次从seq中取一个值放入var中,并在循环体expr中进行使用。

最简单的举例

#打印1-10:

> for(n in 1:10) {   #循环变量为n,循环次数seq为10

+   print(n)          #循环一次,表达1次(打印n)

+ }

[1] 1

[1] 2

[1] 3

[1] 4

[1] 5

[1] 6

[1] 7

[1] 8

[1] 9

[1] 10

#求和并打印1-100总和

> sum <- 0

> for(i in 1:100){

+   sum = sum + i

+ }

> sum

[1] 5050

体会下 与以下程序的区别

sum <- 0

for(i in 1:100){

 sum = sum + i

print(sum)

}

2. 循环语句 和if语句的联合

循环语句经常与条件语句联合,帮助条件语句实现一个变量所有变量值的循环。其书写方式是,for语句expr内容改成if语句代码。

for(var in seq) {

expr

}  

换成

for(var in seq) {

if (conditon1) {

expr1

} else if (conditon1){

expr2

} else{

expr3

}

}  

循环语句联合条件语句IF语句

for(i in 1:length(z$v1)){   #length函数常用来获取变量值的个数

 if(z$v1[i]<3){    # z$v1[i]指的是z$v1第i个变量值

   z$v4[i]<-1

 } else if((z$v1[i]<4)){

   z$v4[i]<-2

 } else{

   z$v4[i]<-3

 }

}

通过上述函数,我们就根据v1的值,进行变量的转换,形成新变量v4

> z

 v1 v2 v3 v4

1  1  6 11  1

2  2  7 12  1

3  3  8 13  2

4  4  9 14  3

5  5 10 15  3

上述问题属于变量值的转换,我们在之前第9天已经介绍过,变量值的常用方法,你还记得吗?今天的if和循环语句又是一种新的变量值转换方法了,不妨了解下

· 最后出一道供大家思考

对于不同的数据,以计算一个新变量,

当v1变量<3时候,这个新变量是原来变量i次方;

当v1变量为<4时候,这个变量是原变量的i-1次方;

当v1<5的时候,这个变量是原变量的i-2次方;

当v1>=5的时候,这个变量是上一个变量值+10;

答案明天公布

DAY11的内容就介绍到这里!

最后,一个月就能学会R语言,你敢挑战一下吗?

想挑战的话,请加入R语言的交流群吧?(由于群规模限制,请先加入郑老师微信号:扫描以下二维码,并注明R语言)

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多