当 R 中的另一个向量中存在指定条目时,如何创建一个也重复最后一个值的序列?

How can I create a sequence that also repeats the last value when specified entries are present in another vector in R?

我想创建 x2 下显示的内容。

我想从 1 开始,让 x2 中的值每次增加一个值。当 x1 中出现 TRUE 时,该值应该增加一次并保持不变,除非跟随三个或更多 TRUE,在这种情况下,它应该在每隔一对 TRUE 期间增加一个值。

x1 中的一个 TRUE 将始终在下一行中跟随至少一个 TRUE。

示例问题和预期结果:

x1<-c("FALSE", "FALSE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "TRUE", "TRUE", "FALSE", "TRUE", "TRUE", "FALSE")
x2<-c(1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11)
data.frame(x1, x2)

      x1 x2
1  FALSE  1
2  FALSE  2
3   TRUE  3
4   TRUE  3
5  FALSE  4
6   TRUE  5
7   TRUE  5
8  FALSE  6
9   TRUE  7
10  TRUE  7
11  TRUE  8
12  TRUE  8
13 FALSE  9
14  TRUE 10
15  TRUE 10
16 FALSE 11

也许我把这个复杂化了,但这里有一个方法:

library(dplyr)

df %>%
  group_by(gr = data.table::rleid(x1)) %>%
  mutate(gr1 = !x1 |  (x1 & row_number() %% 2 == 1)) %>%
  ungroup() %>%
  mutate(out = cumsum(gr1)) %>%
  select(-gr, -gr1)


#    x1     x2   out
#   <lgl> <int> <int>
# 1 FALSE     1     1
# 2 FALSE     2     2
# 3 TRUE      3     3
# 4 TRUE      3     3
# 5 FALSE     4     4
# 6 TRUE      5     5
# 7 TRUE      5     5
# 8 FALSE     6     6
# 9 TRUE      7     7
#10 TRUE      7     7
#11 TRUE      8     8
#12 TRUE      8     8
#13 FALSE     9     9
#14 TRUE     10    10
#15 TRUE     10    10
#16 FALSE    11    11

数据

df <- data.frame(x1, x2)
df <- type.convert(df)
cumsum(ave(as.logical(x1), x1, FUN = function(x){
    if(x[1] == TRUE) {
        rep(1:0, length.out = length(x))
    } else {
        rep(1, length(x))
    }
}))
#[1]  1  2  3  3  4  5  5  6  7  7  8  8  9 10 10 11