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

mik*_*sey 2 excel if-statement nested r

我现在才开始深入研究IF声明R.根据我在IF语句CRAN文档中看到的,它看起来IF必须是所有语句nested.

这是真的?如果是这样,这个IF/THEN结构更像是EXCEL,我认为,不像是直接的RUBYPython IF/THEN逻辑的.我不打扰这个正确的吗?

EXCEL(gui,not 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
) 
Run Code Online (Sandbox Code Playgroud)

Nested IF/THEN 很复杂,因为您确保正确关闭功能.

下一部分 - 我不是100%肯定,因为我是两种语言的初学者,但是...在Ruby或者Python,你可以IF用更结构化的方式显式地编写一个函数:

IF 
ELSE
END
Run Code Online (Sandbox Code Playgroud)

这更加简单明了.

我错过了在R中运行它的正确方法,还是那么复杂?有没有一个好的资源,我还没有找到IF/THEN/Loop for R?

谢谢

Hon*_*Ooi 7

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

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

if(test) {
    statements
}
else if(test2) {
    statements
}
else {
    statements
}
Run Code Online (Sandbox Code Playgroud)

R也有这个ifelse功能,它确实很像Excel =IF.上面的if-elseif-else的粗略等价物将是

ifelse(test, result1, ifelse(test2, result2, result3))
Run Code Online (Sandbox Code Playgroud)

一个关键的区别是,在第二示例中,test,result1,result2result3是所有矢量.

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

  • 只是为了使问题复杂化(或简化!),R的`if`也是*一个函数.例如,你可以写`x < - if(a <b)1 else 2`,而不是`if(a <b)x < - 1 else x < - 2`.但这与问题相关. (2认同)

zwo*_*wol 6

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

if (a1 < 20)
  a1 * 1
else if (a1 < 50)
  a1 * 2
else if (a1 < 100)
  a1 * 3
else
  a1 * 4
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你可以在a1 * n表达式周围加上花括号.但是,如果a1是一个向量,而不是标量,你可能想评价并行比较所有矢量元素,这与做ifelse,这确实巢喜欢你的Excel构建:

ifelse(a1 < 20, a1 * 1,
       ifelse(a1 < 50, a1 * 2,
              ifelse(a1 < 100, a1 * 3,
                               a1 * 4)))
Run Code Online (Sandbox Code Playgroud)

为vector编写它的第三种方法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
Run Code Online (Sandbox Code Playgroud)


42-*_*42- 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
Run Code Online (Sandbox Code Playgroud)

并进一步考虑它如果你想将一个函数应用于"A",该findInterval函数也可以用作第一个参数switch.

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