我有一个向量,基本上是一段时间内记录的数据点,例如 -
data_vector <- c(5,21,25,26,67,24,15,11,15,19,27,28,22,14,11)
我想要一个在数据超过用户定义的阈值时识别索引的函数,这两个函数都随着数据的减少和增加而增加。为了识别并输出在数据减少时超过阈值(在这种情况下为20.01)的值,此功能完成工作 -
> x <- function(threshold){
+ crossing_points_down <- c()
+ for (i in 1:length(data_vector-1)) {
+ if ((data_vector[i] > threshold && data_vector[i+1] < threshold ) == TRUE) {
+ crossing_points_down <- append(crossing_points_down,i+1)
+ }
+ }
+ return(crossing_points_down)
+ }
>
> x(20.01)
[1] 7 14
但是当逻辑运算符被反转以找到向上的交叉点时,我得到了这个错误 -
> x <- function(threshold){
+ crossing_points_up <- c()
+ for (i in 1:length(data_vector-1)) {
+ if ((data_vector[i] < threshold && data_vector[i+1] > threshold ) == TRUE) {
+ crossing_points_up <- append(crossing_points_up,i+1)
+ }
+ }
+ return(crossing_points_up)
+ }
>
> x(20.01)
Error in if ((data_vector[i] < threshold && data_vector[i + 1] > threshold) == :
missing value where TRUE/FALSE needed
为什么这两个函数的行为不同以及如何解决这个问题?
答案 0 :(得分:2)
你的括号错误:
for (i in 1:(length(data_vector)-1)) {
但是,您不应该使用循环。这是一个矢量化解决方案:
which(data_vector[-length(data_vector)] > 20.01 &
data_vector[-1] < 20.01) + 1
#[1] 7 14