这是一个非常具体的问题。。。但它来了。
我有一个表示热变化的数据向量,从中我想知道某个东西是"打开"还是"关闭"。这个东西总是从"关"开始。+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")))
}
我相信我解决了问题!感谢其他解决方案人员