我有一个向量x
:
x <- c(0, -0.084, 0.19, 0.23, 0.23, 0.21, 0.04, -0.04, -0.14, -0.29, -0.2, -0.08, 0.16, 0.7, 0.2, -0.15, -0.3)
# ^
# ^
# first x < -0.2
我想创建一个与x
长度相同的向量y
,它将为1,直到并包括x
中某个条件的索引,例如当x
第一次变得小于-0.2时。在该索引之后,y
应该为0,直到向量结束:
y = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0)
# ^
# last 1 corresponds to -0.29 in x
cumprod(c(TRUE, head(x > -0.2, -1)))
# [1] 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
我们可以使用which
。通过取其中的min
,我们将找到x < -0.2
的第一个实例
newx <- rep(1, length(x))
newx[(min(which(x < -0.2)) + 1):length(x)] <- 0
# [1] 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
这行吗:
y <- abs(-1 + cumsum(x == -0.2))
y
[1] 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
您可以首先使用which找到值首次低于-2.2的索引,然后索引到您的向量中,并将该值之前的所有内容替换为1,将该值之后的所有内容都替换为0:
x <- c(0, -0.084, 0.19, 0.23, 0.23, 0.21, 0.04, -0.04, -0.14, -0.29, -0.2, -0.08, 0.16, 0.7, 0.2, -0.15, -0.3)
idx <- which(x < -.2)[1]
x[1:idx] <- 1; x[(idx+1):length(x)] <- 0
哪个得到结果:
> x
[1] 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
使用cummin
和lag
library(dplyr)
cummin(lag(x >= -0.2, default = TRUE))
#[1] 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
或使用findInterval
cummin(c(1, findInterval(x, -0.2)[-length(x)]))
#[1] 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
或使用which.max
+(seq_along(x) <= which.max(x < -0.2))
#[1] 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
data.table
中的解决方案
library(data.table)
df <- data.table(x= c(0, -0.084, 0.19, 0.23, 0.23, 0.21, 0.04, -0.04, -0.14, -0.29, -0.2, -0.08, 0.16, 0.7, 0.2, -0.15, -0.3))
df[1:which(x<=-0.2)[1], y:=1]
df[is.na(y), y:=0]
df
#Output
x y
1: 0.000 1
2: -0.084 1
3: 0.190 1
4: 0.230 1
5: 0.230 1
6: 0.210 1
7: 0.040 1
8: -0.040 1
9: -0.140 1
10: -0.290 1
11: -0.200 0
12: -0.080 0
13: 0.160 0
14: 0.700 0
15: 0.200 0
16: -0.150 0
17: -0.300 0