代码之家  ›  专栏  ›  技术社区  ›  deeenes

dplyr::变异unquote RHS

  •  1
  • deeenes  · 技术社区  · 8 年前

    我想知道如何正确地 UQ 字符串在中的RHS上创建变量名 dplyr 方法如下 mutate . 查看我在 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) - 操作员无法处理。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Mikko Marttila    8 年前

    通过更改定义行,您的代码应该按预期工作 qcol 收件人:

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

    也就是说,因为 qcol 如果是字符串,则需要将其转换为符号,然后才能在 mutate . 另外,我想你想提到的专栏是 q0 您在数据中定义的列,而不是名为 qval0 .

    推荐文章