如果满足条件,则用向量填充列

kuj*_*ujo 6 r dplyr

我正在尝试解决以下问题。我有一个小贴士:

> tibble( signal = c(0,1,0,0,1,0,0,1,1,1,1,1,1,0), days =0)
# A tibble: 14 x 2
   signal  days
    <dbl> <dbl>
 1      0     0
 2      1     0
 3      0     0
 4      0     0
 5      1     0
 6      0     0
 7      0     0
 8      1     0
 9      1     0
10      1     0
11      1     0
12      1     0
13      1     0
14      0     0
Run Code Online (Sandbox Code Playgroud)

我需要按以下方式填写天数列:

  • 找到 signal==1 并用向量 1,2,3,4 一次填充天数列
  • 在向量结束后找到下一个信号==1,并再次用向量 1,2,3,4 填充 days 列

因此,结果将如下所示:

signal  days
    <dbl> <dbl>
 1      0     0
 2      1     1
 3      0     2
 4      0     3
 5      1     4
 6      0     0
 7      0     0
 8      1     1
 9      1     2
10      1     3
11      1     4
12      1     1
13      1     2
14      0     3
Run Code Online (Sandbox Code Playgroud)

我可以使用 for 循环来做到这一点,但很难做到最好使用 dplyr 进行矢量化。

感谢任何帮助!

sin*_*dur 3

这是基本的东西data.table::set()

library(data.table)
i <- 1L
n <- nrow(df)
while (i < n) {
  if (df$signal[i] == 1) {
    k <- min(i+3L, n)
    set(df, i = (i:k), j = "days", 1L:(k-i+1L))
    i <- i+4L
  } else {
    i <- i+1L
  }
}

#    signal days
# 1       0    0
# 2       1    1
# 3       0    2
# 4       0    3
# 5       1    4
# 6       0    0
# 7       0    0
# 8       1    1
# 9       1    2
# 10      1    3
# 11      1    4
# 12      1    1
# 13      1    2
# 14      0    3
Run Code Online (Sandbox Code Playgroud)