2017-10-28 64 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

相关问题