R中的IF语句 – 总是嵌套?
我现在开始深入研究R
IF
语句。 从我从IFAN语句的CRAN文档中看到,它看起来所有的IF
语句都必须nested
。
这是真的? 如果是这样的话,这个IF/THEN
结构更像EXCEL
,我认为它不像RUBY
或Python
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%确定的,因为我是两种语言的初学者,但是…在Ruby
或Python
,可以以更结构化的方式显式编写IF
函数:
IF ELSE END
这更简单明了。
我错过了一个正确的方式来运行在R中,或者这是复杂的? 是否有一个很好的资源,我还没有find在IF / THEN /循环R吗?
谢谢
实际上有两种forms的if-else
stream量控制逻辑。
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))
一个关键的区别是在第二个例子中, test
, result1
, result2
和result3
都是向量。
如果要对整个数据集执行相同的操作,但是哪一组取决于testing,则应使用第一个操作。 第二个意思是vector化的计算,你要在vector的每个元素上执行不同的操作。
R的许多新用户对于是否感到困惑。 它只评估一个值,然后执行后面的expression式或else
子句。 在R中, ifelse
函数通常是以前的SAS,Excel和SPSS用户所需要的,它将支持嵌套。 在某些情况下, switch
function可能会有所帮助,但我不明白你的非排他性逻辑条件如何立即适合其逻辑。
在你的情况下,我会考虑使用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 * n
expression式的周围加花括号。 但是,如果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