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

我现在开始深入研究R IF语句。 从我从IFAN语句的CRAN文档中看到,它看起来所有的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是复杂的,因为您确保您正确closuresfunction。

接下来的部分 – 我不是100%确定的,因为我是两种语言的初学者,但是…在RubyPython ,可以以更结构化的方式显式编写IF函数:

 IF ELSE END 

这更简单明了。

我错过了一个正确的方式来运行在R中,或者这是复杂的? 是否有一个很好的资源,我还没有find在IF / THEN /循环R吗?

谢谢

实际上有两种forms的if-elsestream量控制逻辑。

if语句大致类似于C,C ++或Java if 。 就像在这些语言中一样, 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都是向量。

如果要对整个数据集执行相同的操作,但是哪一组取决于testing,则应使用第一个操作。 第二个意思是vector化的计算,你要在vector的每个元素上执行不同的操作。

R的许多新用户对于是否感到困惑。 它只评估一个值,然后执行后面的expression式或else子句。 在R中, ifelse函数通常是以前的SAS,Excel和SPSS用户所需要的,它将支持嵌套。 在某些情况下, switchfunction可能会有所帮助,但我不明白你的非排他性逻辑条件如何立即适合其逻辑。

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

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

并进一步思考findInterval函数也可以作为第一个参数来switch如果你想要一个函数被应用到“A”。

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

我不确定我是否理解这个问题,但是Excel代码的一个自然的R相当于

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

如果你愿意的话,你可以在a1 * nexpression式的周围加花括号。 但是,如果a1是一个向量而不是标量,则可能需要对所有向量元素并行地进行比较,这是通过ifelse来完成的,该ifelse嵌套类似于您的Excel构造:

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

为vectora1编写的第三种方法利用了逻辑索引:

 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