r-在for()循环中嵌套ifelse()..语法错误



这是一个非常具体的问题。。。但它来了。

我有一个表示热变化的数据向量,从中我想知道某个东西是"打开"还是"关闭"。这个东西总是从"关"开始。+1.5度的阈值表示它已被切换为"ON",并一直保持打开状态,直到-1.5度的阈值表明它再次被切换"OFF",达到其间的高或低平稳期,+/-变化要小得多。我有一个由正值和负值组成的数字向量,我想将其转换为一个在适当位置具有"ON"one_answers"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"开头

    > Data$switch<- as.character(NA)
    > Data$switch<-as.character(c("OFF",Data$switch[2:(length(Data$switch))]))
    > head(Data$switch
    [1] "OFF" NA    NA    NA    NA    NA

然后,我创建了嵌套的ifelse((for((循环,说明Data$开关的第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"。在较大的数据集上,这些似乎是在值<1.5?我再次尝试了多种形式的语法,但这些都不是更好,而是更糟。有人能帮忙找出问题吗?数据$delta是一个数字矢量。

好。以下是您的增量值,采用更便于复制/粘贴的格式

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)

以下是获取所需数据的一种方法。首先,我跟踪"打开"one_answers"关闭"标志何时出现,并将初始标志设置为关闭(关闭=1,打开=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]
    > 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")))
}

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

最新更新