【问题标题】:Recode on multiple conditions dplyr在多个条件下重新编码 dplyr
【发布时间】:2018-04-02 23:17:55
【问题描述】:

如果变量采用 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

-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

我可以使用 base R 来快速解决这个问题,但是当我已经在使用 mutate() 时,dplyr 通常很方便。唉,这意味着我目前使用多个嵌套的 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)))

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

want <- mutate(have, 
hrs_workperwk = if_else(hrs_workperwk = c(-2, -1, 99), as.numeric(NA), hrs_workperwk))

【问题讨论】:

    标签: r dplyr recode


    【解决方案1】:

    我们可以使用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
    

    或者另一个选项是case_when

    df %>%
       mutate(hrs_workperwk = case_when(hrs_workperwk %in% c(-1, -2, 99)~ NA_integer_,
                          TRUE ~ hrs_workperwk))
    

    【讨论】:

      【解决方案2】:

      你可以使用%in%:

      want <- have %>% 
        mutate(hrs_workperwk = ifelse(hrs_workperwk %in% c(-1, -2, 99), NA, hrs_workperwk))
      

      【讨论】:

        【解决方案3】:

        在基础 R 中:

        df1$hrs_workperwk[df1$hrs_workperwk %in% c(-1,-2,99)] <- NA
        

        is.na(df1$hrs_workperwk) <- df1$hrs_workperwk %in% c(-1,-2,99)
        

        两种情况的输出:

        #   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
        

        数据

        df1 <- read.table(text="
        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",h=T,strin=F)
        

        【讨论】:

        • 我完全忘记了is.na&lt;- 是一个函数。整洁。
        • 在我看来这是一个令人困惑的问题,有人可能认为它的目的是替换 NAs 而不是分配 NA 值,我不会在我的代码中使用它,但为了完整性:) .
        猜你喜欢
        • 1970-01-01
        • 2018-05-11
        • 1970-01-01
        • 2018-08-06
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多