2017-10-28 16 views
1

UQ 문자열이 dplyr과 같은 방법으로 mutate의 RHS에서 변수 이름을 만들었습니까? 나는이 MWE의 wilcox.test 일부 의견에있어 오류 메시지를 참조하십시오dplyr :: mutate unquote RHS

require(dplyr) 

dfMain <- data.frame(
    base = c(rep('A', 5), rep('B', 5)), 
    id = letters[1:10], 
    q0 = rnorm(10) 
) 

backgs <- list(
    A = rnorm(13), 
    B = rnorm(11) 
) 

fun <- function(dfMain, i = 0){ 

    pcol <- sprintf('p%i', i) 
    qcol <- sprintf('q%i', i) 

    (
     dfMain %>% 
     group_by(id) %>% 
     mutate(
      !!pcol := ifelse(
       !is.nan(!!qcol) & 
       length(backgs[[base]]), 
       wilcox.test(
        # !!(qcol) - backgs[[base]] 
        # object 'base' not found 
        # (!!qcol) - backgs[[base]] 
        # non-numeric argument to binary operator 
        (!!qcol) - backgs[[base]] 
       )$p.value, 
       NaN 
      ) 
     ) 
    ) 

} 

dfMain <- dfMain %>% fun() 

나는 전체 표현식은 찾을 수없는 이유 변수 이름뿐만 아니라 맺다하고 싶은대로 내가 !!(qcol) ... 그것을 해석 추측 base? 나는 또한 (!!qcol)이 문자열 자체를 반환한다는 사실을 알았으므로 놀라움없이 - 연산자가 처리 할 수 ​​없습니다.

답변

1

당신이 라인을 변경하여 예상대로 당신이 qcol을 정의하는 경우 귀하의 코드가 작동해야합니다입니다

qcol <- as.symbol(sprintf('q%i', i)) 

qcol 문자열을 때부터, 당신이 unquoting 전에 상징으로 바꿀 필요, mutate에서 올바르게 평가됩니다. 또한 참조하려는 열이 qval0이 아닌 존재하지 않는 열이 아니라 데이터에 정의한 q0 열이라고 가정합니다.

+0

감사합니다. Mikko! 사실'q0' 나는이 오타를 수정합니다. 또한 qcol을 문자열로 남겨두면'(!! as.name (qcol))'이 작동한다는 것을 발견했습니다. – deeenes