【问题标题】:dplyr::mutate unquote RHSdplyr::mutate 取消引用 RHS
【发布时间】:2017-10-28 17:54:56
【问题描述】:

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

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

【问题讨论】:

    标签: r dplyr nse rlang


    【解决方案1】:

    将定义qcol 的行更改为:

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

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

    【讨论】:

    • 谢谢 Mikko!确实q0 我会改正这个错字。我还发现如果我将qcol 保留为字符串,(!!as.name(qcol)) 可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 2019-02-23
    • 2019-01-21
    • 2017-08-08
    • 2016-01-28
    • 1970-01-01
    相关资源
    最近更新 更多