我正在尝试创建一个包含值的变量,并在达到另一个预定义值时重置。
例如。我有一些数据存储在矢量中。在另一个向量(结果)中,当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)
我可以单独评估这些条件,但我无法弄清楚如何设置可重置的条件标志。
由于
麦克
答案 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);