如何执行元素控制流程?

时间:2015-05-05 15:56:44

标签: r

我想实现元素控制流程。一个例子:

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]。

2 个答案:

答案 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,但我认为你想做的就是......