在dplyr :: case_when中使用NSE

时间:2017-10-18 14:04:27

标签: r dplyr nse

我已阅读Programming with dplyr文档并尝试编写围绕case_when()函数的简单函数。

library(dplyr)
data_test <- data.frame(
    a = rep(c("a", "b", "c"), each = 5),
    b = rnorm(15)
)

fun_test <- function(df, var1, var2) {

    var1 <- enquo(var1)
    var2 <- enquo(var2)

    df <- mutate(df,
                 c = case_when(
                     !!var1 == "a" ~ 1,
                     !!var1 == "b" ~ 2,
                     !!var1 == "c" ~ 3
                 ),
                 d = case_when(
                     !!var2 > 0 ~ 1,
                     !!var2 < 0 ~ 0
                 ))

    df

}

fun_test(data_test, a, b)

我希望根据cd中的值创建新列ab,但它们只是{{} 1}}和NA。任何想法为什么会这样?

干杯。

1 个答案:

答案 0 :(得分:2)

您需要围绕 !! vars 括号,因此!!var1 == "a" ~ 1应为(!!var1) == "a" ~ 1

fun_test <- function(df, var1, var2) {

    var1 <- enquo(var1)
    var2 <- enquo(var2)

    df <- mutate(df,
                 c = case_when(
                     (!!var1) == "a" ~ 1,
                     (!!var1) == "b" ~ 2,
                     (!!var1) == "c" ~ 3
                 ),
                 d = case_when(
                     (!!var2) > 0 ~ 1,
                     (!!var2) < 0 ~ 0
                 ))

    df       
}

fun_test(data_test, a, b)

#    a           b c d
# 1  a  0.70352390 1 1
# 2  a -0.10567133 1 0
# 3  a -1.25864863 1 0
# 4  a  1.68443571 1 1
# 5  a  0.91139129 1 1
# 6  b  0.23743027 2 1
# 7  b  1.21810861 2 1
# 8  b -1.33877429 2 0
# 9  b  0.66082030 2 1
# 10 b -0.52291238 2 0
# 11 c  0.68374552 3 1
# 12 c -0.06082195 3 0
# 13 c  0.63296071 3 1
# 14 c  1.33551762 3 1
# 15 c  0.00729009 3 1