Okey,我在一些应该很简单的事情上遇到了麻烦。如果我有这样的数据框:
x <- data.frame(a = seq(1,3), b = seq(2,4), c = seq(3,5), d = seq(4,6), b2 = seq(5,7), c2 = seq(6,8), d2 = seq(7,9))
# a b c d b2 c2 d2
# 1 2 3 4 5 6 7
# 2 3 4 5 6 7 8
# 3 4 5 6 7 8 9
我想使用mutate_at根据b / b2,c / c2等的结果创建新列。
myvars <- c(2:4)
dvars <- c(5:7)
x <- x %>%
mutate_at(vars(myvars), funs('_new' = vars(myvars) / vars(dvars)))
我收到一个错误“评估错误:二进制运算符的非数字参数。”
我也尝试使用mapply
,但无法使其正常工作。
我要使用mutate_at的原因是,我想在下一步中根据该划分的结果对原始列进行更改。
答案 0 :(得分:2)
您可以直接做
x[myvars]/x[dvars]
# b c d
#1 0.4000000 0.5000000 0.5714286
#2 0.5000000 0.5714286 0.6250000
#3 0.5714286 0.6250000 0.6666667
我不确定是否可以使用mutate_at
来执行此操作,但是可以使用map2_df
中的purrr
purrr::map2_df(x[myvars], x[dvars], ~ .x/.y)
或与mapply
mapply("/", x[myvars], x[dvars])
答案 1 :(得分:1)
我们可以在表达式中创建它,然后使用parse_exprs
中的rlang
求值
library(dplyr)
expr1 <- paste0(names(x)[myvars], "/", names(x)[dvars])
x %>%
mutate(!!! rlang::parse_exprs(expr1))