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)
我确信我的方法做错了,我当然可以用非冗长的方式做这件事,但看起来这应该有效.您可以使用更多列来扩展它以获得类似的结果.
我认为(但没有证据;))这是因为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这不会“即时”更新列,因此会给出所需的结果。