好的
所以我有一个循环,当前找到一个低于< -1的值并将打印1,否则为0.然后循环,直到找到另一个值> = 1.
value <- c(0.2,0.3,0.4,0.5,0.6,-2.0,0.7,0.4,-10,0.1,0.2,0.4,3.0,0.6,0.7,0.8,-1.2,0.6,0.7,0.8,0.3,0.5,2,0.1,0.2)
df <- data.frame(signal =0,value)
df$signal[[1]] = ifelse(df$value[[1]] < (-1), 1, 0)
for (i in 2:nrow(df)){
df$signal[i] = ifelse(df$value[i] < (-1), 1,
ifelse(df$value[i] >= 1, 0,
df$signal[i-1]))
}
df
我打算做的不是退出循环&gt; 1,而是在固定数量的'n'行之后退出。 因此,如果我将总循环行程设置为从初始-1找到的5行,它将在其行进最大nlines为5之后打印0。
如果我们在最多5行行程中遇到另一个信号1,则忽略这一点并继续前行5行。
我想着设置一个柜台:
counter <- 1
repeat {
df$signal = ifelse(df$value < (-1), 1, 0)
counter <- counter+1
if(counter > 5) {
break
}
}
以上接缝合理但不会产生我的结果。
有人对此有任何想法吗?
所需的输出是:
signal value
1 0 0.2
2 0 0.3
3 0 0.4
4 0 0.5
5 0 0.6
6 1 -2.0
7 1 0.7
8 1 0.4
9 1 -10.0
10 1 0.1
11 0 0.2
12 0 0.4
13 0 3.0
14 0 0.6
15 0 0.7
16 0 0.8
17 1 -1.2
18 1 0.6
19 1 0.7
20 1 0.8
21 1 0.3
22 0 0.5
23 0 2.0
24 0 0.1
25 0 0.2
注意每个&lt; -1.0值我们打印1并且行5行...同样在第9行,我们有一个重复&lt; 1.0而最大5 nlines条件没有得到满足,这忽略了重复在最大'n'行程内。
再次第17行我们遇到&lt; -1.0并打印1行,最多行程为5行。
答案 0 :(得分:1)
这应该适合你:
value <-c(0.2,0.3,0.4,0.5,0.6,-2.0,0.7,0.4,-10,0.1,0.2,0.4,3.0,0.6,0.7,0.8,-1.2,0.6,0.7,0.8,0.3,0.5,2,0.1,0.2)
res <- NULL
while (length(res) < length(value)) {
if (value[length(res)+1] < -1) {
res <- c(res, rep(1,5))
} else {
res <- c(res, 0)
}
}
res <- data.frame(signal = res, value = value)
res
不知道反制解决方案。似乎很复杂。
编辑:您可能需要这样做:
res <- res[1:length(value)]
转换为数据框之前。这可确保您的信号列不长于观察/值列。