【发布时间】:2016-10-24 16:58:34
【问题描述】:
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 的方式来做这件事,但看起来这应该可行。您可以使用更多列来扩展它以获得类似的结果。
【问题讨论】:
-
这看起来很奇怪。试试
if_else,即mytbl %>% mutate_all(funs(if_else(a!=0, ., NA_real_))) -
这确实很奇怪。
ifelse没有这种行为,所以如果您只想让它工作,@akrun 可以满足您的需求。然而,这种行为真的很奇怪。如果我使用select来反转列顺序,则错误会反转,因此,这是列顺序的问题。如果我使用mutate_each( ..., everything() ),我会遇到同样的问题,但如果我使用mutate_each( ..., b),它会在b列中正确分配NAs。我希望我能给你一个更好的答案,但我不知道发生了什么。