循环

时间:2016-03-03 00:45:02

标签: r

以下是导致我出现问题的玩具模型。我有一个T和F的向量。我想遍历这个向量,如果最后3个元素的总和是> = 1(这意味着它们中至少有1个为TRUE),我将空向量中的一个元素指定为1,否则我指定一个元素空向量为0.这样,当for循环遍历起始向量时,我用1和0填充空向量。我遇到的问题是错误,我将在下面粘贴。

two_true <- c(T,F,F,F,F,F,F,F,F,T,T,T,F,F,T,F,F,F,F,F,F)

look_bac <- 3

no_signal1 <- c()
for(i in 1:length(two_true)) {
        if(sum(two_true[i:(i+look_bac-1)]) >= 1) {
                no_signal1[i] <- 1 
        } else {
                        no_signal1[i] <- 0
                }
}

运行此命令会出现以下错误:

if中的错误(sum(two_true [i:(i + look_bac - 1)])&gt; = 1){:   缺少需要TRUE / FALSE的值

我似乎没有得到这个,因为if语句的条件显然是TRUE或FALSE。

我知道有很多其他方法可以创建这个新的向量,但我正在尝试学习R基础知识,所以使用上述工具(if语句和for循环)的任何帮助都会有所帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

由于评论中的渔民已经指出(@Gregor,@ Mike Fang),你的总和会为你的矢量的最后一个元素返回NA,因为i=20的总和中有一个NA:{ {1}}。

解决方案 - 将sum(c(FALSE, FALSE, NA))选项添加到na.rm=TRUE

sum()

然而,R对于循环来说并不是一个友好的环境,因为循环中有一个激烈的敌人:if(sum(two_true[i:(i+look_bac-1)], na.rm=TRUE) >= 1) { 函数的大房子,它通常在速度竞争中超过任何循环:

apply

在一行中返回与循环相同的内容:

library(zoo)
as.numeric(rollapply(two_true, 3 ,sum, partial=TRUE, align="left")>0)

所以,总结一下,欢迎来到R并与我们友好的> as.numeric(rollapply(two_true, 3 ,sum, partial=TRUE, align="left")>0) [1] 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 > no_signal1 [1] 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 函数见面!