dplyr 0.8.0 mutate_at:使用自定义函数而不覆盖原始列

时间:2019-04-01 19:41:43

标签: r dplyr

在dplyr 0.8.0中使用list()而不是funs()使用新的语法,我希望能够从mutate_at()创建新的变量而不覆盖旧的变量。基本上,我需要在几列中用NA替换值上的所有整数,而不会覆盖这些列。

我已经使用dplyr的早期版本进行了此工作,但是我想适应dplyr中的更改,因此我的代码不会在以后中断。

说我有个小标题:

x <- tibble(id = 1:10, x = sample(1:10, 10, replace = TRUE), 
            y = sample(1:10, 10, replace = TRUE))

我希望能够用NA替换大于5的任何值。我曾经这样做,结果就是我想要的:

x %>% mutate_at(vars(x, y), funs(RC = replace(., which(. > 5), NA)))
# A tibble: 10 x 5
      id     x     y  x_RC  y_RC
   <int> <int> <int> <int> <int>
 1     1     2     3     2     3
 2     2     2     1     2     1
 3     3     3     4     3     4
 4     4     4     4     4     4
 5     5     2     9     2    NA
 6     6     6     8    NA    NA
 7     7    10     2    NA     2
 8     8     1     3     1     3
 9     9    10     1    NA     1
10    10     1     8     1    NA

这是我尝试过的,但是不起作用:

x %>% mutate_at(vars(x, y), list(RC = replace(., which(. > 5), NA)))
  

[<-.data.frame*tmp*,列表中的错误,值= NA):     新列将在现有列之后留下空白

这有效,但是替换了原始变量:

x %>% mutate_at(vars(x, y), list(~replace(., which(. > 5), NA)))
# A tibble: 10 x 3
      id     x     y
   <int> <int> <int>
 1     1     2     3
 2     2     2     1
 3     3     3     4
 4     4     4     4
 5     5     2    NA
 6     6    NA    NA
 7     7    NA     2
 8     8     1     3
 9     9    NA     1
10    10     1    NA

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

几乎在这里,只需创建一个命名列表即可。

x %>% mutate_at(vars(x, y), list(RC = ~replace(., which(. > 5), NA)))