如果我有类似的数据框
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")
之类的变体,但是没有用。有人知道可行的变体吗?
答案 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=.))