mutate_at-涉及两个变量的函数

时间:2018-06-19 11:32:21

标签: r dplyr

如果我有类似的数据框

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

我能做

df %>% mutate(Y = if_else(X > 10, -Y, Y),
              Z = if_else(X > 10, -Z, Z))

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

我的尝试

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

但这会导致Evaluation error: object 'X' not found。我尝试了get("X")之类的变体,但是没有用。有人知道可行的变体吗?

2 个答案:

答案 0 :(得分:5)

这是使用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

可复制的数据:

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

答案 1 :(得分:0)

由于上面的docendo discimus answer,我意识到如何以这种方式使用预定义的功能(docendo的答案非常有效,我更喜欢这样):

testfun <- function(x,y){if_else(x>10, -y, y)}

df%>%mutate_at(vars(Y,Z), funs(testfun(x=X,y=.))