R中的条件标志

时间:2016-08-06 17:38:14

标签: r

我正在尝试创建一个包含值的变量,并在达到另一个预定义值时重置。

例如。我有一些数据存储在矢量中。在另一个向量(结果)中,当x&lt; = -.50中的值直到x&gt;时,我想将值设置为-1。同样的,如果x是> =。50,则将值设置为1,直到x <1。 0

x <- c(-.28 , -.32, -.38, -.49, -.52, -.44, -.33, -.28, -.16, 0, .18, .22, .33, .42, .52, .32, .26, 0, -.10, -.15)

Result <- c(0, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0 , 1, 1, 1, 0, 0 ,0)

Comb <- data.frame(x, Result)

我可以单独评估这些条件,但我无法弄清楚如何设置可重置的条件标志。

由于

麦克

3 个答案:

答案 0 :(得分:3)

gulp.watch()
  

TRUE

答案 1 :(得分:3)

以下是使用na.locf包中zoo的矢量化方法。由于结果仅在绝对值大于0.5或值为切换符号的位置处更改值,我们可以找出这些位置,填充相应的值并使用na.locf函数填充,假设我们从向量NAs

library(magrittr); library(zoo)

# start from a vector of NA of the same length of the vector
rep(NA, length(x)) %>% 
    # place 0 at positions wherever there is a sign change
    replace(c(T, diff(sign(x)) != 0), 0) %>%   
    # place +1 or -1 at positions wherever the absolute value is larger than 0.5
    replace(abs(x) >= 0.5, sign(x[abs(x) >= 0.5])) %>% 
    # fill the NA with the previous values -1, 0 or 1
    na.locf()

# [1]  0  0  0  0 -1 -1 -1 -1 -1  0  0  0  0  0  1  1  1  0  0  0

答案 2 :(得分:1)

这是一个Rcpp解决方案:

library(Rcpp);
cppFunction('
    IntegerVector hysteresisRangeFlagWithReset(DoubleVector x,double low,double high,double reset) {
        IntegerVector res(x.size());
        if (x.size()==0) return res;
        res[0] = x[0]<=low ? -1 : x[0] >= high ? 1 : 0;
        for (int i = 1; i < x.size(); ++i)
            res[i] =
                x[i]<=low ? -1 :
                x[i]>=high ? 1 :
                x[i-1]<reset && x[i]>=reset || x[i-1]>reset && x[i]<=reset ? 0 :
                res[i-1]
            ;
        return res;
    }
');
hysteresisRangeFlagWithReset(x,-0.5,0.5,0)
##  [1]  0  0  0  0 -1 -1 -1 -1 -1  0  0  0  0  0  1  1  1  0  0  0

数据

x <- c(-0.28,-0.32,-0.38,-0.49,-0.52,-0.44,-0.33,-0.28,-0.16,0,0.18,0.22,0.33,0.42,0.52,0.32,
0.26,0,-0.10,-0.15);