2016-07-28 3 views
0

가능하면 다음 동작을 dplyr으로 복제하고 싶습니다.많은 요인 행을 dplyr로 다시 레이블

내가하는 일은 꽤 쉽다 : 특정 기준선 레벨을 가진 여러 가지 요인이 있으며, 0/1 변수로 단순화하고 싶다.

나는이 같은 데이터 세트 시뮬레이션 경우

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

가 그럼 난 쉽게 이런 것을 얻을 수 있습니다

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

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

그러나 dplyr이이 날 이길 것입니다. 내가 mutate_which을 사용하는 것에 대해 생각하고 있는데, 나는 fn과 같은 사용자 정의 함수로 작업 할 수 없다.

+0

% dt % % mutate (x = fn (x), y = fn (y))의 문제점은 무엇입니까? ? – Psidom

+0

또는'df %> % mutate_at (vars (x, y), funs (if_else (. == "c", 0, 1)))' –

답변

1

Psidon에 의해 게시 대답,

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

쉽게 일반화 정확하지만하지 않습니다.

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

아니면 더 투명 버전,

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

내 주요 문제는이 될 것으로 보인다있는 mutate_each로 작동하지 않는 것이 었습니다 :

스티븐 프레 의해 제안 된 대답은 더 일반화이다 단계적으로 종료 :

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

'mutate_each '의 구문은 최소한 이전과는 조금 다릅니다 버전. 'funs = ...'가 아니고'funs (...)'가 아닙니다. 그래서'mutate_each (df, funs (as.integer (.! = "c")), x : y)'대신에' –