如果我有这样的数据框
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")
这样的变体,但它没有用。有谁知道有效的变体?
最佳答案
这是使用 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))
关于r - mutate_at - 涉及两个变量的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50927397/