在多种条件下重新编码 dplyr

JMQ*_*JMQ 1 r dplyr recode

如果变量采用 dplyr 中的三个值之一,我想将其重新编码为“缺失”。考虑以下数据框have

id  married hrs_workperwk
1   1       40
2   1       55
3   1       70
4   0       -1
5   1       99
6   0       -2
7   0       10
8   0       40
9   1       45
Run Code Online (Sandbox Code Playgroud)

-1、-2 和 99 是非法值。新的数据框want应如下所示:

id  married hrs_workperwk
1   1       40
2   1       55
3   1       70
4   0       NA
5   1       NA
6   0       NA
7   0       10
8   0       40
9   1       45
Run Code Online (Sandbox Code Playgroud)

我可以使用基本 R 来快速解决这个问题,但是当我已经使用mutate(). 唉,这意味着我目前使用多个嵌套if_else()函数:

want <- mutate(have, 
hrs_workperwk = if_else(hrs_workperwk < 0, as.numeric(NA), 
                if_else(hrs_workperwk = 99, as.numeric(NA), hrs_workperwk)))
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以只用一个 if_else() 函数来做到这一点?理想情况下是这样的:

want <- mutate(have, 
hrs_workperwk = if_else(hrs_workperwk = c(-2, -1, 99), as.numeric(NA), hrs_workperwk))
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

我们可以用replace

df %>%
  mutate(hrs_workperwk = replace(hrs_workperwk, hrs_workperwk %in% c(-1, -2, 99), NA))
#  id married hrs_workperwk
#1  1       1            40
#2  2       1            55
#3  3       1            70
#4  4       0            NA
#5  5       1            NA
#6  6       0            NA
#7  7       0            10
#8  8       0            40
#9  9       1            45
Run Code Online (Sandbox Code Playgroud)

或者另一个选择是case_when

df %>%
   mutate(hrs_workperwk = case_when(hrs_workperwk %in% c(-1, -2, 99)~ NA_integer_,
                      TRUE ~ hrs_workperwk))
Run Code Online (Sandbox Code Playgroud)