R中的条件语句

时间:2020-02-23 14:43:51  来源:igfitidea点击:

为了进行编程,我们需要能够控制程序执行的流程。
该控制基于某些逻辑条件进行。
当满足条件时,我们希望程序以某种方式运行,而当不满足条件时,我们将以另一种方式操纵程序。
与其他几种编程语言一样,这是通过R中的" if else"语句建立的。

R中的If语句

R支持条件语句的多种变体,例如独立if(如果与else一起),嵌套if和switch。
在本教程中,我们将一一探讨。
if块的基本结构如下。

if (condition) {
#Code to execute if condition is met
} #This code only works if the condition is true.

让我们用一个简单的例子来说明这一点。

if (a<=5) {
print(a^2)
}

上面的代码只是检查一个值是否小于或者等于5,并且如果条件保持良好,它将打印数字的平方值。
让我们以3的值执行它。

[1] 9

如果R中的其他语句

当您以6或者7的值运行此代码时,您将发现根本不会打印任何内容。
这是因为我们没有处理条件可能为假的情况。
这就是为什么使用" else"块的原因。

让我们现在尝试上面带有if块的代码段。
不要忘记在else关键字和左括号" {"之间添加空格。

if(a<=5){
print(a^2)
}
else {
print(a*2)
}

对于值5,上面的程序在if块中运行代码并给出输出25。
但是,当给a大于5的值(例如9)时,将a乘以else中指定的2块。

R中的Ifelse语句

R还具有一个特殊的名为" ifelse"的构造。
当您希望针对向量的每个元素评估条件时,ifelse构造具有很大的灵活性。
稍后我们将详细探讨R向量,但是现在,我们将简单定义一个6个数字的小向量,如下所示。

myvector=c(4,1,6,7,0,4)

现在,我们希望将100除以向量的每个元素并显示结果。
但是,我们知道被0除会产生错误,因此我们想在代码中处理它。
如果我们使用if编写简单的条件语句,则问题在于我们不知道向量中的哪个位置为零。
在这种情况下," ifelse"构造非常有用。

该划分可以如下实现。

division <- ifelse(test=myvector==0,yes=NA,no=100/myvector)

这段代码测试了myvector的特定元素是否为0的条件。
如果是,则结果将填充NA值。
否则进行划分。
现在让我们检查除法结果。

> division
[1]  25.00000 100.00000  16.66667  14.28571        NA  25.00000

在R中嵌套if其他语句

R还支持在另一个块中嵌套if语句。
当我们希望检查彼此分层依赖的多个条件时,此构造会有所帮助。

我们要先检查是否小于10的数字,然后检查是否为偶数。
查看以下旨在实现此目的的代码。

if(a<10){
print("A is less than 10")
 if(a%%2==0){
 print("A is even")
 }
 else {
 print("A is odd")
 }
}

当为a提供值4时,将产生以下结果。

[1] "A is less than 10"
[1] "A is even"

多个if else块

我们还可以按照以下方式堆叠" if-else"块来处理复杂的逻辑场景。

if(a<5){
print("Grade is C")
}else if(a>=5&a<10){
print("Grade is B")
}else if(a>=10&a<20){
print("Grade is A")
}else {
print("Invalid marks")
}

R中的Switch语句

最后,我们有一个特殊的条件语句,叫做switch
如果我们需要产生特定于单个变量的输出,则将证明switch是有用的。
没有switch,我们需要编写一个复杂的if块堆栈。

考虑一个示例,在该示例中,我们需要基于数据集中的"收藏夹"列填写代码。
板球获得CR,足球获得FB,曲棍球获得HK,羽毛球获得BD,网球获得TN。
这可以通过下面的switch语句轻松地处理。

code = switch(EXPR=fx,Cricket='CR',Football='FB',Hockey='HK',Badminton='BD',Tennis='TN')

让我们将fs设置为" Cricket",看看将为我们显示什么代码。

fs <- 'Cricket'
code = switch(EXPR=fx,Cricket='CR',Football='FB',Hockey='HK',Badminton='BD',Tennis='TN',NA)
code

[1] "CR"

看一下switch语句如何轻松地将给定值转换为相应的代码。
这里的EXPR代表我们希望切换的变量。
同样,在切换块中作为最终选项给出的NA用于处理无效输入。