2016-03-03 171 views
1

下面是一个玩具模型的东西,是造成我的问题。我有一个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 
       } 
} 

运行这给了我以下错误:

错误如果(总和(two_true [I:第(i + look_bac - 1)])> = 1){: 缺失值,其中TRUE/FALSE需要

我似乎并没有得到这个,因为if语句的条件显然是TRUE或FALSE变体。我知道可能有许多其他方法来创建这个新的向量,但我想学习R基础知识,所以使用上述工具(如果语句和for循环)的任何帮助将有所帮助。谢谢!

+3

调试循环时,最好知道问题是否仅在某些迭代中发生。在你的循环中放入一个'print(i)'命令,运行所有内容,并查看错误之前循环得到多少。然后,当你看到'i'是20或21时可能会发生问题,将'i'设置为其中一个值并运行违规行:'sum(two_true [i:(i + look_bac-1)]) > = 1'。你可以减少它,并找到问题,'two_true [我:((i + look_bac-1)]',并思考为什么它不适用于'我'的价值。 – Gregor

+2

,因为当你20岁以后,你的if语句将返回NA,这就是为什么你会收到错误信息。 – fhlgood

+2

第一条评论:*如何钓鱼*;第二条评论*这里是你的鱼*。 – Gregor

回答

0

由于评论中的渔民已经指出(@Gregor,@Mike Fang),因此您的向量的最后一个元素的和会返回NA,因为您的总和为i=20sum(c(FALSE, FALSE, NA))

解决方案 - 添加na.rm=TRUE选项sum()

if(sum(two_true[i:(i+look_bac-1)], na.rm=TRUE) >= 1) { 

但是,由于是循环的敌人猛烈R是不是真的环路友好的环境:的apply功能的大房子,通常逃脱任何循环速度的较量:

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

返回与您的循环在单行:

> 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 

因此,总结一下,欢迎来到R和我们友好的apply功能!