Home > OS >  Keep previous value if it is under a certain threshold
Keep previous value if it is under a certain threshold

Time:11-26

I would like to create a variable called treatment_cont that is grouped by group as follows:

ID   day       day_diff     treatment     treatment_cont
1       0         NA            1               1
1      14         14            1               1   
1      20         6             2               2  
1      73         53            1               1   
2       0         NA            1               1   
2      33         33            1               1   
2      90         57            2               2   
2     112         22            3               2  
2     152         40            1               1   
2     178         26            4               1   

Treatment_cont is the same as treatment but we want to keep the same treatment regime only when the day_diff, the difference in days between treatments, is lower than 30.

I have tried many ways on dplyr, manipulating the table, but I cannot figure out how to do it efficiently.

CodePudding user response:

Probably, a conditional mutate, using case_when and lag might work:

df %>% mutate(treatment_cont = case_when(day_diff < 30 ~ treatment,TRUE ~ lag(treatment)))

CodePudding user response:

You are probably looking for lag (and perhaps it's brother, lead):

df %>% 
  replace_na(list(day_diff=0)) %>%
  group_by(ID) %>%
  arrange(day) %>%
  mutate(
    treatment_cont = ifelse(day_diff < 30, lag(treatment_cont, default = treatment_cont[1]),treatment_cont)

# A tibble: 10 x 5
      ID   day day_diff treatment treatment_cont
   <int> <int>    <dbl>     <int>          <int>
 1     1     0        0         1              1
 2     1    14       14         1              1
 3     1    20        6         2              1
 4     1    73       53         1              1
 5     2     0        0         1              1
 6     2    33       33         1              1
 7     2    90       57         2              2
 8     2   112       22         3              2
 9     2   152       40         1              1
10     2   178       26         4              1
  ) %>%
  ungroup %>%
  arrange(ID, day)
  • Related