mutate_at-涉及两个变量的函数

Dri*_*ies 1 r dplyr

如果我有一个像

set.seed(1)    
df <- data.frame(X = 5:14,
       Y = runif(10,0,1),
       Z = runif(10,0,1))
Run Code Online (Sandbox Code Playgroud)

我可以

df %>% mutate(Y = if_else(X > 10, -Y, Y),
              Z = if_else(X > 10, -Z, Z))
Run Code Online (Sandbox Code Playgroud)

但是,如果我有很多要以相同方式转换的变量,则我更喜欢使用mutate_at。但是,在这种情况下,我无法正常工作。

我的尝试:

testfun <- function(y){if_else(X > 10, -y, y)}
df %>% mutate_at(vars(c("Y","Z")),funs(testfun))
Run Code Online (Sandbox Code Playgroud)

但这导致Evaluation error: object 'X' not found。我尝试了类似的变体get("X"),但没有用。有谁知道有效的变体吗?

tal*_*lat 6

这是使用的简单方法mutate_at

library(dplyr)
df %>% 
  mutate_at(vars(Y,Z), funs(if_else(X > 10, -., .)))

#     X           Y          Z
# 1   5  0.26550866  0.2059746
# 2   6  0.37212390  0.1765568
# 3   7  0.57285336  0.6870228
# 4   8  0.90820779  0.3841037
# 5   9  0.20168193  0.7698414
# 6  10  0.89838968  0.4976992
# 7  11 -0.94467527 -0.7176185
# 8  12 -0.66079779 -0.9919061
# 9  13 -0.62911404 -0.3800352
# 10 14 -0.06178627 -0.7774452
Run Code Online (Sandbox Code Playgroud)

可复制的数据:

set.seed(1)
df <- data.frame(X = 5:14,
                 Y = runif(10,0,1),
                 Z = runif(10,0,1))
Run Code Online (Sandbox Code Playgroud)