2017-10-26 12 views
0

I가 mutate에 대한 다음 (크게 단순화) dplyr 예 :어떻게 dplyr에서 작동하는 문자열로 여러 열을 전달하는 :: mutate_at

xx <- data.frame(x = 1:10, y = c(rep(1,4),rep(2,6))) 
bla_fun <- function(x,y){cat(x," ",y,"\n"); min(x,y)} 

xx %>% rowwise() %>% 
    mutate(z = bla_fun(x,y)) 

나는 그것을 전달할 수 있습니다 mutate_at 작업을 좀하고 싶습니다 나 열 이름을 문자열로.

xx %>% rowwise() %>% 
    mutate_at(c("x","y"), funs("bla_fun")) 

하지만 작동하지 않습니다. 어떻게 작동 시키는가?

+0

당신이 행 분을 계산 하시겠습니까 :

귀하의 특정 예

가 해결 될 수있는이 같은합니다 (min을 가정하는 것은 pmin로 대체 될 수없는 자리 표시 자입니다)? 'mutate_at'는 행을 현명하게 처리하기위한 것이 아닙니다. – Psidom

답변

0
syms <- rlang::syms(c("x", "y")) 
xx %>% 
    rowwise() %>% 
    mutate(z = bla_fun(!!! syms)) 

사이드 참고 1 : mutate_at N 개의 변수, N 개의 변수없는 한 n 차 함수 N 단항 함수를 적용하기위한 일반적이다. mutate이 작업을 수행합니다.

보조 참고 사항 2 : 행별로 그룹화 할 필요가 없습니다. 보다 간단하게 mutate(xx, z = purrr::map2_dbl(x, y, bla_fun))을 쓰거나 bla_funpmin()에서 mutate으로 직접 작성/벡터화 할 수 있습니다.
문자열에 syms (예 : mutate(xx, z = mapply(bla_fun, !!! syms)))을 사용하거나 mutate(xx, z = purrr::pmap_dbl(list(!!! syms), bla_fun))을 사용합니다.

0

mutate_at은 모든 단일 열을 개별적으로 변이시킵니다.

xx %>% 
    mutate(z = map2(!!sym("x"), !!sym("y"), !!sym("bla_fun")))