mik*_*sey 2 excel if-statement nested r
我现在才开始深入研究IF声明R.根据我在IF语句的CRAN文档中看到的,它看起来IF必须是所有语句nested.
这是真的?如果是这样,这个IF/THEN结构更像是EXCEL,我认为,不像是直接的RUBY或Python 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?
谢谢
在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,result2和result3是所有矢量.
如果要对整个数据集执行相同的操作集,则应使用第一个,但哪个集取决于测试.第二个用于矢量化计算,您希望对矢量的每个元素执行不同的操作.
我不确定我是否理解这个问题,但是您的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)
许多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"......条目和所以我从代码中省略了它们.)