2017-10-28 6 views
1

Ich frage mich, wie man richtig UQ String erstellt Variablennamen auf der RHS in dplyr Methoden wie mutate. Sehen Sie sich die Fehlermeldungen Ich habe in den Kommentaren im wilcox.test Teil dieses MWE:dplyr :: muate unquote RHS

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() 

ich !!(qcol) ... denke, es interpretiert wird, als ich den ganzen Ausdruck unquote möchte nicht nur der Variablenname, deshalb ist es nicht finden base? Ich fand auch heraus, dass (!!qcol) die Zeichenfolge selbst zurückgibt, so dass keine Überraschung der --Operator nicht damit umgehen kann.

Antwort

1

Code sollte funktionieren, wie Sie durch eine Änderung der Linie erwarten, wo Sie qcol zu definieren:

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

Das heißt, da qcol eine Zeichenfolge war, können Sie es in ein Symbol drehen musste, bevor unquoting für es in Ihrer mutate richtig ausgewertet werden. Außerdem nehme ich an, dass die Spalte, auf die Sie verweisen wollten, die q0 Spalte war, die Sie in Ihren Daten definierten, nicht eine nicht existierende Spalte mit dem Namen qval0.

+0

Danke Mikko! In der Tat "q0" werde ich diesen Tippfehler beheben. Außerdem habe ich festgestellt, dass '(!! as.name (qcol))' funktioniert, wenn ich 'qcol' als String belasse. – deeenes

Verwandte Themen