反转逻辑运算符会导致R函数失败?

时间:2015-03-01 16:08:11

标签: r operators

我有一个向量,基本上是一段时间内记录的数据点,例如 -

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

为什么这两个函数的行为不同以及如何解决这个问题?

1 个答案:

答案 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