2014-06-10 415 views
0

非常具体的问题......但这里就是了。在for()循环中嵌套的ifelse()...语法错误?

我有一个指示热变化的数据矢量,并且从中想知道是否已经切换了'ON'或'OFF'。这总是开始'OFF'。 +1.5度的阈值表示它已经被切换为“开”,并且一直保持到-1.5度的阈值表示其已经被再次切换为“关”,在+/-之间变化较小时达到高或低平稳。我有一个正值和负值的数值向量,我希望在适当的位置将其转换为字符或因子,并且级别为'ON'和'OFF'。

使用该:

> Data$delta 
    [1] 0.02 0.00 0.04 -0.06 -0.06 -0.02 0.01 0.31 0.22 0.21 -0.09 -0.02 0.03 0.02 0.01 
    [16] 0.00 0.02 0.03 0.03 0.04 0.04 0.01 0.00 0.01 0.02 0.05 0.04 0.04 0.01 0.04 
    [31] 0.02 0.01 -0.03 0.00 0.03 0.03 0.03 0.04 0.04 0.02 0.02 0.01 0.02 -0.02 -0.01 
    [46] -0.03 0.01 0.03 0.37 0.14 0.04 -0.34 -0.15 -0.07 0.00 0.01 0.29 0.03 0.26 -0.12 
    [61] 0.05 -0.02 -0.03 0.10 -0.11 -0.01 -0.07 -0.03 -0.01 0.01 0.30 0.12 0.05 -0.25 -0.06 
    [76] -0.04 -0.04 -0.07 -0.02 0.01 0.04 0.02 0.03 -0.07 -0.12 -0.18 -0.12 -0.08 -0.05 -0.04 
    [91] 0.34 2.99 4.29 5.00 1.83 -0.51 -1.63 -0.33 2.62 -0.38 

我创建一个空的载体来接收for()循环输出和插入 'OFF' 作为开关总是与 'OFF'

​​

我开始然后创建我嵌套的ifelse()for()循环,考虑到Data $ switch的第1行已经完成...

> for(i in (2:(length(Data$delta)))) 
    { ifelse(Data$switch[1:((length(Data$switch))-1)] == "OFF", 
     (ifelse (Data$delta[i] < 1.5 , Data$switch[i] <- "OFF", Data$switch[i] <- "ON")), 
     (ifelse (Data$delta[i] > {-1.5} , Data$switch[i] <- "ON", Data$switch[i] <- "OFF"))) 
    } 

它返回......

> Data$switch 
[1] "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" 
[16] "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" 
[31] "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" 
[46] "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" 
[61] "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" 
[76] "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" "OFF" 
[91] "OFF" "ON" "ON" "ON" "ON" "ON" "OFF" "ON" "ON" "ON" 

所有显示正常...除了值98,这不应该切换到“ON”与delta只有“-0.33”。在一个较大的数据集上,这些数据似乎是从OFF到ON的常规虚假变化,值为< 1.5?我已经以多种形式再次尝试过这种语法,但这些都不是更好。任何人都可以帮助确定问题吗?数据$增量是一个数字向量。

+0

值97和98有一个标志:-1.63 \ ** - 0.33 \ **并将被视为字符。我的代码中没有看到as.numeric,但会将这些值设置为NA。 – Henk

+0

@亨克......对不起,国旗不是一面旗帜,我试图用粗体字来表示这个观点。我将改变这个 – Roasty247

回答

0
> for(i in (2:(length(Data$delta)))) 
{ ifelse(Data$switch[i-1] == "OFF", 
    (ifelse (Data$delta[i] < 1.5 , Data$switch[i] <- "OFF", Data$switch[i] <- "ON")), 
    (ifelse (Data$delta[i] > {-1.5} , Data$switch[i] <- "ON", Data$switch[i] <- "OFF"))) 
} 

我相信我解决了这个问题!感谢其他解决方案的人

1

好的。这里是你的德尔塔值更复制/粘贴友好格式

delta <- c(0.02, 0, 0.04, -0.06, -0.06, -0.02, 0.01, 0.31, 0.22, 0.21, 
-0.09, -0.02, 0.03, 0.02, 0.01, 0, 0.02, 0.03, 0.03, 0.04, 0.04, 
0.01, 0, 0.01, 0.02, 0.05, 0.04, 0.04, 0.01, 0.04, 0.02, 0.01, 
-0.03, 0, 0.03, 0.03, 0.03, 0.04, 0.04, 0.02, 0.02, 0.01, 0.02, 
-0.02, -0.01, -0.03, 0.01, 0.03, 0.37, 0.14, 0.04, -0.34, -0.15, 
-0.07, 0, 0.01, 0.29, 0.03, 0.26, -0.12, 0.05, -0.02, -0.03, 
0.1, -0.11, -0.01, -0.07, -0.03, -0.01, 0.01, 0.3, 0.12, 0.05, 
-0.25, -0.06, -0.04, -0.04, -0.07, -0.02, 0.01, 0.04, 0.02, 0.03, 
-0.07, -0.12, -0.18, -0.12, -0.08, -0.05, -0.04, 0.34, 2.99, 
4.29, 5, 1.83, -0.51, -1.63, -0.33, 2.62, -0.38) 

这里有一种方法来获得你想要的数据。首先,我跟踪时“开”和发生“关”的标志和设置初始标志设定为OFF(关闭= 1,ON = 2)

flags <- ifelse(delta< -1.5, 1, ifelse(delta>1.5, 2, NA)) 
flags[1]<-1 

现在这个载体有很多缺失值。我需要做的只是把最后的价值转移。我会做到这一点与

state <- Reduce(function(a,b) {ifelse(is.na(b),a,b)}, flags, accumulate=T) 
c("OFF","ON")[state] 
+0

+1为'Reduce',但是,因为你最终在'Reduce'中,避免使用'Reduce(function(i1,i2){if(i2> = 1.5)return(“ ON“); if(i2 <= -1.5)return(”OFF“); return(i1)},c(”OFF“,as.list(delta [-1])),acc = T)'看起来有效,除非我失去了一些东西。 –