使用dplyr的mutate_all进行条件替换

Jus*_*b81 9 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

kon*_*vas 4

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

dplyr::mutate_all(mytbl, funs(replace(., a != 0, NA)))
Run Code Online (Sandbox Code Playgroud)

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

dplyr::mutate_all(mytbl, funs(replace(., a > 0, 10)))
Run Code Online (Sandbox Code Playgroud)

它会给出所需的行为。你可以试试

dplyr::mutate_all(mytbl, funs(replace(., mytbl$a != 0, NA)))
Run Code Online (Sandbox Code Playgroud)

a这不会“即时”更新列,因此会给出所需的结果。