2017-05-23 4 views
1

Ich versuche, die neue Implementierung der Standardauswertung in dplyr v.0.6.0 herauszufinden. Ich habe mich durch die Vignette gearbeitet, aber ich kämpfe immer noch, wenn ich einen Ausdruck erstelle, der in mutate ausgewertet werden soll.dplyr v.0.6.0 Standardbewertung mutieren

Angenommen, ich möchte eine Funktion erstellen, die einen Dummy zu einer x für jede Zeile hinzufügt, wobei var gleich value ist. Es sollte sowohl bei NA Werten als auch bei regulären Werten funktionieren.

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) 
} 

nun folgende Arbeiten fein

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

Allerdings bedeutet dies nicht

make_dummy_at_value(x, some_var, 2) 

Ich denke, wir nur einen nicht notierten Ausdruck in der mutate Anweisung setzen, aber wie es zu implementieren dann?

Prost

+0

Wolltest du 'if (is.na (!! value_e))' in Zeile 5 schreiben? – FlorianGD

Antwort

1

Die value braucht keine enquo, da es ein numerisches Element ist und nicht eine Zeichenkette in Anführungszeichen. Es ist auch keine Spalte. Es kann direkt im 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 

verwendet werden, wenn die Absicht numerisch für 'Wert' sowie String zu übergeben, dann

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 

ein weiteres Beispiel für die Verwendung

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 
+1

Ah ich sehe, mein Verstand drehte sich ein bisschen ... Danke – Edwin

Verwandte Themen