1

如果我有一个像

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"),但没有奏效。有谁知道有效的变化?

4

2 回答 2

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

可重现的数据:

set.seed(1)
df <- data.frame(X = 5:14,
                 Y = runif(10,0,1),
                 Z = runif(10,0,1))
于 2018-06-19T11:44:31.787 回答
0

感谢上面的docendo discimus回答,我意识到如何以这种方式使用预定义的函数(docendo的回答完美,我只是喜欢这样):

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

df%>%mutate_at(vars(Y,Z), funs(testfun(x=X,y=.))
于 2018-06-19T12:27:08.367 回答