2017-10-28 15 views
1

私は正しくUQの文字列をdplyrのようにdplyrの方法でRHSに作成した文字列をmutateのように作成しました。私はこの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() 

私はそれが見つからない理由です式全体だけではなく、変数名をUNQUOTEしたいと、それが解釈され!!(qcol) ...を推測base?私はまた(!!qcol)が文字列自体を返すので、驚きはないので、-オペレータはそれを処理できません。

あなたのコードは、あなたがに qcolを定義する行変更することにより、期待通りに動作するはずです

答えて

1

qcolが文字列だったので、あなたがunquoting前のシンボルにそれを回すために必要な、ある

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

をそれはあなたのmutateで正しく評価されるべきです。また、参照したい列が、データに定義したq0列であり、存在しない列であるqval0ではないと仮定します。

+0

ありがとうございました!確かに 'q0'私はこのタイプミスを修正します。また、文字列として 'qcol'を残しておけば、'(!! as.name(qcol)) 'が動作することも発見しました。 – deeenes

関連する問題