使用dplyr的mutate_all进行条件替换

时间:2016-10-24 16:58:34

标签: r dplyr

library(tidyverse)
mytbl <- tibble(a = rep(c(1,1,0,1), 4), b= rep(c(1,0,0,1), 4))

    # A tibble: 16 × 2
           a     b
       <dbl> <dbl>
    1      1     1
    2      1     0
    3      0     0
    4      1     1
    5      1     1
    6      1     0
    7      0     0
    8      1     1
    9      1     1
    10     1     0
    11     0     0
    12     1     1
    13     1     1
    14     1     0
    15     0     0
    16     1     1

如果我对第二列的条件一切都很好

dplyr::mutate_all(mytbl, funs(replace(., b != 0, NA)))

    # A tibble: 16 × 2
           a     b
       <dbl> <dbl>
    1     NA    NA
    2      1     0
    3      0     0
    4     NA    NA
    5     NA    NA
    6      1     0
    7      0     0
    8     NA    NA
    9     NA    NA
    10     1     0
    11     0     0
    12    NA    NA
    13    NA    NA
    14     1     0
    15     0     0
    16    NA    NA

但是,如果我在第一列上进行调整,则仅替换第一列

dplyr::mutate_all(mytbl, funs(replace(., a != 0, NA)))

    # A tibble: 16 × 2
           a     b
       <dbl> <dbl>
    1     NA     1
    2     NA     0
    3      0     0
    4     NA     1
    5     NA     1
    6     NA     0
    7      0     0
    8     NA     1
    9     NA     1
    10    NA     0
    11     0     0
    12    NA     1
    13    NA     1
    14    NA     0
    15     0     0
    16    NA     1

我确信我的做法在做错了,我当然可以用非dplyr的方式做这件事,但看起来这应该有效。您可以使用更多列来扩展它,以获得类似的结果。

1 个答案:

答案 0 :(得分:3)

我认为(但没有证据;))这是因为a被改变,然后重新检查条件。所以当你这样做时

dplyr::mutate_all(mytbl, funs(replace(., a != 0, NA)))

a变异(因此它不再包含非零值) - 然后重新评估条件a != 0但从不返回TRUE。如果您将此更改为例如

dplyr::mutate_all(mytbl, funs(replace(., a > 0, 10)))

它会产生所需的行为。你可以尝试

dplyr::mutate_all(mytbl, funs(replace(., mytbl$a != 0, NA)))

无法动态更新专栏a&#34;&#34;所以会得到理想的结果。