2016-07-28 12 views
0

Ich möchte das folgende Verhalten mit dplyr replizieren, wenn das möglich ist.Viele Faktorzeilen mit dplyr neu beschriften

Es ist ziemlich trivial, was ich tue: Ich habe eine Reihe von Faktoren, die eine bestimmte Grundlinie haben, und ich möchte sie zu 0/1 Variablen vereinfachen.

Wenn ich ein Datum simulieren wie folgt festgelegt:

df <- data.frame(id = 1:100, 
       x = factor(sample(c("a", "b", "c"), 100, T)), 
       y = factor(sample(c("a", "b", "c"), 100, T))) 

Dann kann ich einfach, dass wie dies erreichen:

fn <- function(x) { 
    ifelse(x == "c", 0, 1) 
} 

df[c("x", "y")] <- apply(df[c("x", "y")], 2, fn) 
df 

jedoch in dplyr dies scheint mich zu besiegen. Ich denke über die Verwendung mutate_which, aber ich kann nicht scheinen, dass das mit einer benutzerdefinierten Funktion wie fn arbeiten.

+0

Was ist das Problem mit 'df%>% mutieren (x = fn (x), y = fn (y))' ? – Psidom

+0

Oder 'df%>% mutate_at (vars (x, y), Spaß (if_else (. ==" c ", 0, 1)))' –

Antwort

1

Die Antwort von Psidon geschrieben,

df %>% mutate(x = fn(x), y = fn(y)) 

ist richtig, aber nicht ohne weiteres verallgemeinerbar.

Die Antwort von Steven Beaupré vorgeschlagen ist verallgemeinerbar:

df %>% mutate_at(vars(x:y), funs(if_else(. == "c", 0, 1))) 

Oder eine transparentere Version,

df %>% mutate_at(.funs = function(x) {ifelse(x == "c", 0, 1)}, .cols = vars(x:y)) 

war mein Hauptproblem, dass dies mit mutate_each funktioniert nicht war, was zu sein scheint auslaufen:

df %>% mutate_each(funs = function(x) {ifelse(x == "c", 0, 1)}, cols = vars(x, y)) 
Error: is.fun_list(calls) is not TRUE 
+0

Die Syntax in 'mutate_each' ist etwas anders, zumindest in der vorherigen Versionen. Es ist nicht 'Spaß = ...' aber 'Spaß (...)'. Sie können also 'mutate_each (df, funs (as.integer (.! =" C ")), x: y)' stattdessen versuchen –