2017-05-23 15 views
1

私はdplyr v.0.6.0で標準評価の新しい実装を理解しようとしています。私はビネットを通って仕事をしてきましたが、評価する式を作成するときにはまだ苦労していますmutatedplyr v.0.6.0標準評価の変異

varvalueに等しい各行に対してxにダミーを追加する関数を作成したいとします。それはNAの値と通常の値の両方で動作するはずです。

library(dplyr) 
make_dummy_at_value <- function(x, var, value) { 
    var_e <- enquo(var) 
    value_e <- enquo(value) 
    if (is.na(value)) { 
    x <- x %>% mutate(dum = as.numeric(is.na(!!var_e))) 
    } else { 
    x <- x %>% mutate(dum = as.numeric(!!var_e == !!value_e)) 
    } 
    return(x) 
} 

さて、次は大丈夫

x <- data.frame(some_var = c(NA, 2)) 
make_dummy_at_value(x, some_var, NA) 

しかし、これは

make_dummy_at_value(x, some_var, 2) 

私たちは唯一mutate文で1つのクォートされていない表現を置くことができると思いませんが、それを実装する方法を動作しますそれで?それが数値要素ではなく引用符で囲んだ文字列であるよう

乾杯

+0

5行目に 'if(is.na(!! value_e))'を書くのですか? – FlorianGD

答えて

1

valueはどのenquoを必要としません。また、列でもありません。意図は、他の例

x1 <- data.frame(col1 = c(NA, 4, 5), col2 = c('A', NA, 'B'), stringsAsFactors= FALSE) 
make_dummy_at_value(x1, col1, NA) 
# col1 col2 dum 
#1 NA A 1 
#2 4 <NA> 0 
#3 5 B 0 
make_dummy_at_value(x1, col2, NA) 
# col1 col2 dum 
#1 NA A 0 
#2 4 <NA> 1 
#3 5 B 0 
make_dummy_at_value(x1, col2, A) 
# col1 col2 dum 
#1 NA A 1 
#2 4 <NA> 0 
#3 5 B 0 
を使用し、次いで

make_dummy_at_value <- function(x, var, value) { 
    var_e <- enquo(var) 
    value <- enquo(value) 
    value_e <- quo_name(value) 

    if (is.na(value_e)) { 
    x %>% 
     mutate(dum = as.numeric(is.na(!!var_e))) 
    } else { 
    x %>% 
     mutate(dum = as.numeric((!!var_e) == value_e & !is.na(!!var_e))) 
    } 

} 

make_dummy_at_value(x, some_var, 2) 
# some_var dum 
#1  NA 0 
#2  2 1 
make_dummy_at_value(x, some_var, NA) 
# some_var dum 
#1  NA 1 
#2  2 0 
make_dummy_at_value(x, some_var, v1) 
# some_var dum 
#1  NA 0 
#2  2 0 

、「値」の列として数値も通過させることである場合、それは直接mutate/summarise

make_dummy_at_value <- function(x, var, value) { 
    var_e <- enquo(var) 

    if (is.na(value)) { 
    x %>% 
     mutate(dum = as.numeric(is.na(!!var_e))) 
    } else { 
    x %>% 
     mutate(dum = as.numeric((!!var_e) == value & !is.na(!!var_e))) 
    } 

} 



make_dummy_at_value(x, some_var, 2) 
# some_var dum 
#1  NA 0 
#2  2 1 
make_dummy_at_value(x, some_var, NA) 
# some_var dum 
#1  NA 1 
#2  2 0 

make_dummy_at_value(x, some_var, 3) 
# some_var dum 
#1  NA 0 
#2  2 0 

内で使用することができます

+1

ああ、私の心は少し回転しています...ありがとう – Edwin

関連する問題