dplyr mutate_at函数应用于多个列 - 使用动态列名称

时间:2018-04-04 19:56:07

标签: r dynamic dplyr mutate

我有一个数据框x。

x <- data.frame(a = c(10, 20, 30, 0), b = c(1, 2, 3, 0), c = c(1, 2, 3, 0), d = c(8, 16, 24, 0))
x
denominator_var <- "a"
numerator_vars <- c("b", "c", "d")

使用dplyr,我正在尝试添加新列(b_share,c_share和d_share),使它们每个都等于相应的列(b,c和d),分为a。 但是,对我来说,使用NOT原始变量名称而不是动态变量名称非常重要。

我的代码无效。怎么了?

x %>% mutate_at(vars(one_of(numerator_vars)),
                funs(share = ifelse(!!(denominator_var) > 0, round(./!!(denominator_var) * 100, 2), 0)))

非常感谢!

2 个答案:

答案 0 :(得分:1)

在应用as.name之前,您可以尝试使用!!

x %>% mutate_at(vars(one_of(numerator_vars)), funs(share = 
  ifelse(!!(as.name(denominator_var)), round(./!!(as.name(denominator_var))) * 100, 2)))

#    a b c  d b_share c_share d_share
# 1 10 1 1  8       0       0     100
# 2 20 2 2 16       0       0     100
# 3 30 3 3 24       0       0     100
# 4  0 0 0  0       2       2       2

答案 1 :(得分:1)

您可以事先通过quo分母获得所需的结果:

denominator_var <- quo(a)
x %>% mutate_at(numerator_vars,
                funs(share = ifelse(!!(denominator_var) > 0, 
                                    round(./!!(denominator_var) * 100, 2),
                                    0)))

另请注意,您无需使用vars作为向量numerator_vars