我有一个数据框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)))
非常感谢!
答案 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
。