r - dplyr 0.8.0 mutate_at : use of custom function without overwriting original columns

标签 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)))

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/

相关文章:

r - 使用 dplyr 过滤行总和时出错

r - 根据特定列更改数据框中的值

r - 查找一个向量的前 n 个元素,其中包含另一个向量的所有元素

r - 隔离r数据框中的部分文本

r - 估计面板中​​常见集合成员随时间变化的百分比

r - 识别 R 数据框列中的数字或字符序列

r - R 中的条件交叉表

r - 按特定评级的最高值对堆叠条进行排序

r - 使用分位数箱的 ID 的 data.table 中的新列值

r - 估计多个日期之间的差距