dplyr :: mutate unquote RHS

Мне интересно, как правильно 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) возвращает саму строку, поэтому неудивительно, что оператор - не может ее обработать.


person deeenes    schedule 28.10.2017    source источник


Ответы (1)


Ваш код должен работать так, как вы ожидаете, изменив строку, в которой вы определяете qcol, на:

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

То есть, поскольку qcol был строкой, вам нужно было преобразовать ее в символ перед снятием кавычек, чтобы она правильно оценивалась в вашем mutate. Также я предполагаю, что столбец, на который вы хотели сослаться, был столбцом q0, который вы определили в своих данных, а не несуществующим столбцом с именем qval0.

person Mikko Marttila    schedule 28.10.2017
comment
Спасибо, Микко! Действительно q0 Я исправлю эту опечатку. Также я обнаружил, что (!!as.name(qcol)) работает, если я оставлю qcol в виде строки. - person deeenes; 29.10.2017