如何为 r 中单个 case_when 参数中引用的每一行设置一个值?

How to set a value for each row referenced in a single case_when argument in r?

这是一些示例代码。

df <- structure(list(v1 = c(1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 
1, 1, 1, 1, 0, 1, 0, 0, 1), v2 = c(1, 0, 1, 1, 0, 1, 0, 1, 0, 
1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1), flag = c(NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA)), class = "data.frame", row.names = c(NA, -22L))

我对变量“flag”的编码很感兴趣,这样当 v1 = 0 和下一个 v2 = 0 时,两行在标志列中都会得到一个 'flag'。如果已经放置了标志,则无法更改(即第 5 行不会被单独标记,但在查看第 4 行时已经被标记)

这是所需的数据框。

df2 <- structure(list(v1 = c(1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 
1, 1, 1, 1, 0, 1, 0, 0, 1), v2 = c(1, 0, 1, 1, 0, 1, 0, 1, 0, 
1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1), flag = structure(c(NA, 
NA, NA, 1L, 1L, 1L, 1L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, 1L, 1L, NA), .Label = "flag", class = "factor")), class = "data.frame", row.names = c(NA, 
-22L))

我从下面的代码开始,它符合我想要的条件,但只更改符合 v1 条件的行,而不是两者。

df2 <- df %>% 
  mutate( flag = case_when(v1 == 0 & lead(v2)== 0 ~ 'flag'))

这是我真实数据的一个非常简化的版本,我知道除了使用 case_when 之外还有其他选择,但我真的很想使用 case_when。这个功能(我也愿意使用 ifelse.

library(tidyverse)
df %>%
  mutate(f = v1 == 0 & lead(v2) == 0,
      flag = ifelse(f|lag(f), 'flag', NA), f = NULL)

   v1 v2 flag
1   1  1 <NA>
2   1  0 <NA>
3   0  1 <NA>
4   0  1 flag
5   0  0 flag
6   0  1 flag
7   1  0 flag
8   1  1 <NA>
9   0  0 <NA>
10  1  1 <NA>
11  0  0 <NA>
12  1  1 <NA>
13  0  0 <NA>
14  1  1 <NA>
15  1  0 <NA>
16  1  0 <NA>
17  1  0 <NA>
18  0  1 <NA>
19  1  1 <NA>
20  0  1 flag
21  0  0 flag
22  1  1 <NA>