我现在才开始深入研究IF
中的R
语句。根据我从CRAN documentation on IF statements看到的内容,它看起来所有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
很复杂,因为您确保正确关闭了这些功能。
下一部分 - 我不是百分百肯定,因为我是两种语言的初学者,但是......在Ruby
或Python
中,您可以明确地写一个{{1以更有条理的方式运行:
IF
这更加简单明了。
我是否错过了在R中运行此方法的正确方法,还是这样复杂?有没有一个好的资源,我还没有在IF / THEN / Loop上找到R?
由于
答案 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))
关键区别在于,在第二个示例中,test
,result1
,result2
和result3
都是向量。
如果要对整个数据集执行相同的操作集,则应使用第一个,但 设置取决于测试。第二个用于矢量化计算,您希望在矢量的每个元素上执行不同的操作。
答案 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”。 。条目,所以我从代码中省略了它们。)