Search code examples
rcase-when

Fill whole new column with value of another column until the row of the value of another column is reached


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?


Solution

  • 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)