2017-10-18 3 views
0

J'ai lu le document Programming with dplyr et essayé d'écrire un simple retour de fonction autour de la fonction case_when().Utiliser NSE dans 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) 

J'espère que les nouvelles colonnes c et d seraient créés sur la base des valeurs et ab, mais ils sont juste NA et 0. Des idées pourquoi c'est le cas?

Cheers.

Répondre

2

Vous avez besoin des parenthèses autour !! vars, donc !!var1 == "a" ~ 1 devrait être (!!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