R中的IF语句 - 总是嵌套?

时间:2012-01-22 17:00:24

标签: excel r if-statement nested

我现在才开始深入研究IF中的R语句。根据我从CRAN documentation on IF statements看到的内容,它看起来所有IF语句都必须是nested

这是真的吗?如果是,则此IF/THEN结构更像EXCEL,我认为,不像RUBYPython IF/THEN逻辑那样直截了当。我没有打断这个吗?

EXCEL(gui,而非VBA)中,您必须运行如下公式:

#IF Statement 1
=IF(A1<20, A1*1, 
#IF Statement 2
IF(A1<50, A1*2,
#IF Statement 3
IF(A1<100, A1*3, A1*4)
#Closes IF Statement 2
)
#Closes IF Statement 1
) 

Nested IF/THEN很复杂,因为您确保正确关闭了这些功能。

下一部分 - 我不是百分百肯定,因为我是两种语言的初学者,但是......在RubyPython中,您可以明确地写一个{{1以更有条理的方式运行:

IF

这更加简单明了。

我是否错过了在R中运行此方法的正确方法,还是这样复杂?有没有一个好的资源,我还没有在IF / THEN / Loop上找到R?

由于

3 个答案:

答案 0 :(得分:7)

R实际上有两种形式的if-else流量控制逻辑。

if语句是第一个近似值,非常类似于C,C ++或Java的if。就像在这些语言中一样,您可以按顺序链接if

if(test) {
    statements
}
else if(test2) {
    statements
}
else {
    statements
}

R还具有ifelse功能,这与Excel的=IF非常相似。上面if-elseif-else的粗略等价物是

ifelse(test, result1, ifelse(test2, result2, result3))

关键区别在于,在第二个示例中,testresult1result2result3都是向量。

如果要对整个数据集执行相同的操作集,则应使用第一个,但 设置取决于测试。第二个用于矢量化计算,您希望在矢量的每个元素上执行不同的操作。

答案 1 :(得分:6)

我不确定我是否理解这个问题,但是Excel代码的自然R等价物

if (a1 < 20)
  a1 * 1
else if (a1 < 50)
  a1 * 2
else if (a1 < 100)
  a1 * 3
else
  a1 * 4

如果你愿意,你可以在a1 * n表达式周围加上花括号。但是,如果a1是一个向量而不是一个标量,你可能想要为所有向量元素并行评估比较,这是用ifelse完成的,其中嵌套像你的Excel构造:

ifelse(a1 < 20, a1 * 1,
       ifelse(a1 < 50, a1 * 2,
              ifelse(a1 < 100, a1 * 3,
                               a1 * 4)))

为向量a1编写第三种方法,利用了逻辑索引:

a2 <- a1 # take a copy
a2[a1 >=  20 & a1 <  50] <- a1[a1 >=  20 & a1 <  50] * 2
a2[a1 >=  50 & a1 < 100] <- a1[a1 >=  50 & a1 < 100] * 3
a2[a1 >= 100           ] <- a1[a1 >= 100           ] * 4

答案 2 :(得分:6)

R的许多新用户对if感到困惑。它仅计算单个值,然后执行后面的表达式或else子句。在R中,ifelse函数通常是以前的SAS,Excel和SPSS用户想要的,它将支持嵌套。在某些情况下,switch函数可能会有所帮助,尽管我没有看到您的非排他逻辑条件集如何立即适合其逻辑。

在你的情况下,我会考虑使用findInterval函数。这将在您的示例中完成逻辑和数学运算的组合运算(如果“A”是向量,则返回向量):

A*( 1+ findInterval( A, c(20,50,100) )  )  # OR 
A*( 1+ findInterval( A, c(-Inf, 20, 50, 100) )  ) # the equivalent using -Inf

进一步考虑它如果你想将一个函数应用于“A”,findInterval函数也可以用作switch的第一个参数。

(进一步评论:我假设您的“A1”表达式将被复制到Excel电子表格中的一列或一行单元格中,并且在此过程中,行或列引用会以Excel支持的特定自动方式递增成为A2,A3等。这是一个与你所比较的任何更通用的语言不同的编程视角.R矢量的操作是类似的,但通常不需要“1”,“2”,“3”。 。条目,所以我从代码中省略了它们。)