填充向量,直到另一个向量中的给定条件为止

  • 本文关键字:向量 条件 另一个 填充 r
  • 更新时间 :
  • 英文 :


我有一个向量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

使用cumminlag

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

最新更新