使用 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)))
Error in
[<-.data.frame
(*tmp*
, list, value = NA) : new columns would leave holes after existing columns
这有效,但替换了原始变量:
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
感谢任何帮助!
最佳答案
差不多了,只需创建一个命名列表。
x %>% mutate_at(vars(x, y), list(RC = ~replace(., which(. > 5), NA)))
关于r - dplyr 0.8.0 mutate_at : use of custom function without overwriting original columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55462442/