2015-06-11 4 views
5

Ich kann nicht herausfinden, wie SE dplyr Funktion mit ungültigen Variablennamen zu verwenden, zum Beispiel eine Variable mit einem Leerzeichen in ihm auswählen.Wie verwende ich dplyr SE mit "ungültigen" Namen (dh mit Leerzeichen)?

Beispiel:

df <- dplyr::data_frame(`a b` = 1) 
myvar <- "a b" 

Wenn ich a b Variable auswählen möchten, kann ich es tun mit dplyr::select(df, `a b`), aber wie mache ich das mit select_?

Ich nehme an, ich muss nur eine Funktion, die „Wraps“ eine Zeichenfolge in Backticks finden, so dass ich dplyr::select_(df, backtick(myvar))

+0

Mein erster Vorschlag wäre, keine ungültigen Namen zu verwenden! Warum würdest du das tun? – MrFlick

+0

Entwicklung einer App, mit der Benutzer den Namen einer Variablen ändern können, und für Biologen viele Male würden sie lieber Leerzeichen in einem Namen haben, würde es schwer sein, eine Notiz zu setzen "keine Leerzeichen oder Sonderzeichen verwenden", es werde für sie komisch aussehen. –

+0

@divide_by_zero Ja, ich kann das tun, wenn ich den Variablennamen kenne, aber wenn ich das nicht tue, muss ich die Variable in Backticks "wickeln". Wie erreiche ich das, was Sie mit 'myvar' anstatt mit' a b' hardcoding gemacht haben? –

Antwort

7

Wie MyFlick in den Kommentaren gesagt nennen kann, sollte dieses Verhalten generell vermieden werden, aber wenn Sie möchten, Hadley antwortete auf meine Tweets über dieses und zeigte mir, dass einfach mit as.name arbeiten für diese statt mit Backticks:

df <- dplyr::data_frame(`a b` = 1) 
myvar <- "a b" 
dplyr::select_(df, as.name(myvar)) 
01 können Sie Ihre eigenen Graviszeichen Wrapper

backtick <- function(x) paste0("`", x, "`") 
dplyr::select_(df, backtick(myvar)) 

EDIT machen, damit es funktioniert

2

Meine Lösung war, die Fähigkeit von select zu nutzen, Spalte Positionen zu verwenden. Die as.name Lösung schien für einige meiner Spalten nicht zu funktionieren.

select(df, which(names(df) %in% myvar)) 

oder noch kurz und bündig, wenn bereits in einem Rohr:

df %>% 
select(which(names(.) %in% myvar)) 

Obwohl diese select verwendet, meiner Meinung nach nicht auf NSE angewiesen ist.

Beachten Sie, dass alle Spalten ohne Fehler oder Warnung gelöscht werden, wenn keine Übereinstimmungen vorhanden sind.