Search code examples
rif-statementdplyrgroup-bymutate

How to create use mutate with if statement and groupeby?


I have a data frame with informations on Household ID, type of work and position in the household (1 = reference person, 2=secondary resident).

c <- data.frame(HH_ID=c(1,2,3,1,2,3), WORK = c("Worker", "Manager", "Employee", "Employee", "Manager", "Craftsman"), NOI= c(1,1,1,2,2,2))

I would like to create a new column with the work of the reference person (NOI = 1) of each household. basically, I want to have this :

HH_ID  Work     NOI  Reference Work 
1     Worker     1        Worker
2     Manager    1        Manager
3     Employee   1        Employee
1     Employee   2        Worker
2     Manager    2        Manager
3     Craftsman  2        Employee

I have tried to use mutate and use conditions (if) but it couldn't find the right formulation. I was thinking about something of that sort :

df <- c %>% group_by(HH_ID) %>% mutate(NewVar = if(c$NOI == 2) {coalesce(lag(WORK), lead(WORK))} else {WORK})
```
Thanks for your help!

Solution

  • You don't need any ifs here:

    df |>
      group_by(HH_ID) |>
      mutate(Reference_Work = WORK[NOI == 1]) |>
      ungroup()
    # # A tibble: 6 × 4
    #   HH_ID WORK        NOI Reference_Work
    #   <dbl> <chr>     <dbl> <chr>         
    # 1     1 Worker        1 Worker        
    # 2     2 Manager       1 Manager       
    # 3     3 Employee      1 Employee      
    # 4     1 Employee      2 Worker        
    # 5     2 Manager       2 Manager       
    # 6     3 Craftsman     2 Employee