Follow up on this question
The same dataframes, now with more rows:
df1 <- data.frame(
colA = c("pass", "pass", "pass", "pass", "pass", "sub", "pass", "pass", "pass", "pass"),
colB = c(0, 0, 0, 0, 0, 1, 0, 0, 0, 0),
colC = ""
)
# Output1
colA colB colC
1 pass 0
2 pass 0
3 pass 0
4 pass 0
5 pass 0
6 sub 1
7 pass 0
8 pass 0
9 pass 0
10 pass 0
df2 <- data.frame(
colA = c("pass", "pass", "pass", "pass", "pass", "pass", "pass", "pass", "pass", "pass"),
colB = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
colC = ""
)
# Output2
colA colB colC
1 pass 0
2 pass 0
3 pass 0
4 pass 0
5 pass 0
6 pass 0
7 pass 0
8 pass 0
9 pass 0
10 pass 0
Based on the previous question, colC
returns all 1 values, which is what I was asking for.
df1 %>%
mutate(colC = case_when("sub" %in% colA ~ 1,
TRUE ~ 0))
# Output
colA colB colC
1 pass 0 1
2 pass 0 1
3 pass 0 1
4 pass 0 1
5 pass 0 1
6 sub 1 1
7 pass 0 1
8 pass 0 1
9 pass 0 1
10 pass 0 1
Now I would like to do the following: colC
values should be 1 until the row where sub
is happening, the rest of the column should be 0:
# Output1
colA colB colC
1 pass 0 1
2 pass 0 1
3 pass 0 1
4 pass 0 1
5 pass 0 1
6 sub 1 1
7 pass 0 0
8 pass 0 0
9 pass 0 0
10 pass 0 0
How would this work?
As stated in comments, there may be 2 subs
, so try this
df1 <- data.frame(
colA = c("pass", "pass", "pass", "pass", "pass", "sub", "pass", "pass", "sub", "pass"),
colB = c(0, 0, 0, 0, 0, 1, 0, 0, 1, 0)
)
transform(df1, colC = +(as.logical(rev(cumsum(rev(colA == 'sub'))))))
#> colA colB colC
#> 1 pass 0 1
#> 2 pass 0 1
#> 3 pass 0 1
#> 4 pass 0 1
#> 5 pass 0 1
#> 6 sub 1 1
#> 7 pass 0 1
#> 8 pass 0 1
#> 9 sub 1 1
#> 10 pass 0 0
Created on 2021-05-19 by the reprex package (v2.0.0)