使用mutate_at通过在同一数据框中使用其他列来创建新列

时间:2019-03-14 08:12:39

标签: r mutate

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的原因是,我想在下一步中根据该划分的结果对原始列进行更改。

2 个答案:

答案 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))