2017-10-28 120 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中正確評估。另外,我認爲您想要參考的列是您在數據中定義的q0列,而不是不存在的列,名稱爲qval0

+0

謝謝Mikko!確實'q0'我會修正這個錯字。我還發現'(!! as.name(qcol))'工作,如果我離開'qcol'作爲一個字符串。 – deeenes

相關問題