我想实现元素控制流程。一个例子:
v1 = as.vector(c(1,2,3))
v2 = as.vector(c(3,2,1))
v3 = as.vector(c(0,0,1))
for (i in 1:len(c1)) {
if (c1[i]>=2 && c2[i]<=2) {
v3[i]=1
}
}
# end result: v3 = [0,1,1]
首选的矢量形式(不起作用且效率不高):
if (c1 >=2 & c2 <= 2) {
v3 = 1
}
请注意
v3 = c1 >=2 & c2 <= 2 # end result v3=[0,1,0]
不起作用,因为如果条件为FALSE,则不应该更改v3。
我可以使用哪种矢量语法来避免for循环?注意,如果c1 [i]为FALSE,则根本不会检查c2 [i]。
答案 0 :(得分:1)
我认为你正在寻找ifelse
,它是一个矢量化的if
。
如果你的向量是逻辑的(例如,T或F),你不需要测试它们是否等于TRUE,它们已经是TRUE或FALSE。
c1 = as.logical(sample(c(0, 1), size = 5, replace = T))
c2 = as.logical(sample(c(0, 1), size = 5, replace = T))
c3 = ifelse(c1 & c2, "both are true", "at least one is false")
cbind(c1, c2, c3)
# c1 c2 c3
# [1,] "TRUE" "FALSE" "at least one is false"
# [2,] "FALSE" "FALSE" "at least one is false"
# [3,] "TRUE" "TRUE" "both are true"
# [4,] "TRUE" "TRUE" "both are true"
# [5,] "FALSE" "TRUE" "at least one is false"
对于v
示例,您可以执行此操作:
# no need to coerce vectors to vectors with as.vector()
v1 = c(1, 2, 3)
v2 = c(3, 2, 1)
v3 = c(0, 0, 1)
v3 = ifelse(v1 >= 2 & v2 <= 2, 1, v3)
如果v1
是&gt; = 2且v2
&lt; = 2,则为1,否则返回原始v3
值。
在你的评论中,你这样说:
当遇到一个FALSE时,它会被短路。在这种情况下,如果c1 [i]为FALSE,则无论c2 [i]的值如何,都不会执行“#update”。
这是对的。这就是计算机科学中AND
运算符的含义。如果您不喜欢这种行为,也许您正在寻找OR,它在R中被编码为|
(向量化)或||
(单个元素)。
答案 1 :(得分:0)
为什么不呢:
v <- c(TRUE,TRUE,FALSE,TRUE)
if (FALSE %in% v) { ## update }
if (TRUE %in% v) { ## update , etc, can negate v if nec'y }
当然,不会强迫合乎逻辑的,你需要as.logical,但我认为你想做的就是......