1

我想知道如何正确地UQ在 RHS 上dplyrmutate. 请参阅我在wilcox.test此 MWE 部分的评论中收到的错误消息:

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)返回字符串本身,因此-操作员无法处理它也就不足为奇了。

4

1 回答 1

3

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

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

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

于 2017-10-28T20:53:44.350 回答