dplyr::mutate 取消引用 RHS

dplyr::mutate unquote RHS

我想知道如何在 dplyr 方法(如 mutate)中正确地 UQ 字符串在 RHS 上创建变量名称。请参阅我在此 MWE 的 wilcox.test 部分的评论中收到的错误消息:

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) returns 字符串本身,所以 - 运算符无法处理它也就不足为奇了。

通过将定义 qcol 的行更改为:

,您的代码应该可以按预期工作
qcol <- as.symbol(sprintf('q%i', i))

也就是说,由于 qcol 是一个字符串,您需要在取消引用之前将其转换为一个符号,以便在您的 mutate 中正确评估它。此外,我假设您要引用的列是您在数据中定义的 q0 列,而不是名为 qval0.

的不存在的列