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的方式做这件事,但看起来这应该有效。您可以使用更多列来扩展它,以获得类似的结果。
答案 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;所以会得到理想的结果。