Ich möchte verwenden dplyr::mutate()
, um mehrere neue Spalten in einem Datenrahmen zu erstellen. Die Spaltennamen und deren Inhalt sollten dynamisch generiert werden.
Beispieldaten von Iris:
library(dplyr)
iris <- tbl_df(iris)
Ich habe eine Funktion erstellt, um meine neuen Spalten aus dem zu mutieren Petal.Width
Variablen :
multipetal <- function(df, n) {
varname <- paste("petal", n , sep=".")
df <- mutate(df, varname = Petal.Width * n) ## problem arises here
df
}
Jetzt erstelle ich eine Schleife, um meine Spalten zu erstellen:
for(i in 2:5) {
iris <- multipetal(df=iris, n=i)
}
Da mutate jedoch glaubt, dass varname ein Literalvariablenname ist, erstellt die Schleife nur eine neue Variable (als varname bezeichnet) anstelle von vier (als petal.2 - petal.5 bezeichnet).
Wie kann ich mutate()
meinen dynamischen Namen als Variablennamen verwenden?
dplyr
hat eine ganze Vignette über nicht standardmäßige Bewertungmutate_
, und aus den anderen Funktionen ist nicht ersichtlich, wie sie verwendet werden soll.Antworten:
Da Sie einen Variablennamen dynamisch als Zeichenwert erstellen, ist es sinnvoller, die Zuweisung mithilfe der Standardindizierung von data.frame vorzunehmen, die Zeichenwerte für Spaltennamen ermöglicht. Beispielsweise:
Die
mutate
Funktion macht es sehr einfach, neue Spalten über benannte Parameter zu benennen. Dies setzt jedoch voraus, dass Sie den Namen kennen, wenn Sie den Befehl eingeben. Wenn Sie den Spaltennamen dynamisch angeben möchten, müssen Sie auch das benannte Argument erstellen.dplyr version> = 0.7
In der neuesten Version von
dplyr
(0.7) werden:=
dazu Parameternamen dynamisch zugewiesen. Sie können Ihre Funktion wie folgt schreiben:Weitere Informationen finden Sie in der verfügbaren Dokumentation
vignette("programming", "dplyr")
.dplyr (> = 0,3 & <0,7)
Eine etwas frühere Version von
dplyr
(> = 0,3 <0,7) befürwortete die Verwendung von "Standardbewertungs" -Alternativen zu vielen Funktionen. Weitere Informationen finden Sie in der nicht standardmäßigen Bewertungsvignette (vignette("nse")
).Hier lautet die Antwort also
mutate_()
eher: alsmutate()
:dplyr <0,3
Beachten Sie, dass dies auch in älteren Versionen möglich ist
dplyr
, als die Frage ursprünglich gestellt wurde. Es erfordert den sorgfältigen Umgang mitquote
undsetName
:quelle
do.call()
tut wahrscheinlich nicht das, was du denkst: rpubs.com/hadley/do-call2 . Siehe auch die nse-Vignette in der Dev-Version von dplyr.do.call
Obige aktualisiert , umdo.call("mutate")
esdf
in der Liste zu verwenden und zu zitieren . Haben Sie das vorgeschlagen? Und wenn dielazyeval
Version vondplyr
die veröffentlichte Version ist,mutate_(df, .dots= setNames(list(~Petal.Width * n), varname))
wäre dann eine bessere Lösung?mutate(df, !!newVar := (!!var1 + !!var2) / 2)
funktioniert nicht :(In der neuen Version von
dplyr
(bis0.6.0
April 2017) können wir auch eine Zuweisung (:=
) vornehmen und Variablen als Spaltennamen übergeben, indem wir (!!
) nicht zitieren ( ), um sie nicht auszuwertenÜberprüfen der Ausgabe basierend auf @ MrFlicks
multipetal
Anwendung auf 'iris1'quelle
Nach vielen Versuchen und Irrtümern fand ich das Muster
UQ(rlang::sym("some string here")))
wirklich nützlich für die Arbeit mit Strings und Dplyr-Verben. Es scheint in vielen überraschenden Situationen zu funktionieren.Hier ist ein Beispiel mit
mutate
. Wir möchten eine Funktion erstellen, die zwei Spalten addiert, wobei Sie der Funktion beide Spaltennamen als Zeichenfolgen übergeben. Wir können dieses Muster zusammen mit dem Zuweisungsoperator verwenden:=
, um dies zu tun.Das Muster funktioniert auch mit anderen
dplyr
Funktionen. Hier istfilter
:Oder
arrange
:Für
select
, brauchen Sie nicht das Muster zu verwenden. Stattdessen können Sie verwenden!!
:quelle
myCol
in eine URL (zum Beispiel) und kopiere die alte SpaltemyColInitialValue
am Ende des Datenrahmensdf
mit einem neuen Namen. Aberwhich(colnames(df)=='myCol')
senden Sie die Spalte zurückmyColInitialValue
. Ich habe noch keine Ausgabe geschrieben, weil ich keinen Reprex gefunden habe. Mein Ziel ist derescape
Parameter vonDT::datatable()
. Ichescape=FALSE
warte darauf. Mit Konstanten funktioniert es auch nicht, aber das DT-Paket scheint auch die schlechte # -Spalte zu bekommen. :)escape
anDT::datatable
varname = sym("Petal.Width"); ggplot(iris, aes(x=!!varname)) + geom_histogram()
Hier ist eine andere Version, und es ist wohl ein bisschen einfacher.
quelle
Mit haben
rlang 0.4.0
wir Curly-Curly-Operatoren ({{}}
), was dies sehr einfach macht.Wir können auch zitierte / nicht zitierte Variablennamen übergeben, die als Spaltennamen zugewiesen werden sollen.
Es funktioniert genauso mit
quelle
Ich füge auch eine Antwort hinzu, die dies ein wenig erweitert, da ich bei der Suche nach einer Antwort zu diesem Eintrag gekommen bin und diese fast das hatte, was ich brauchte, aber ich brauchte ein bisschen mehr, das ich über die Antwort von @MrFlik und die R faulen Vignetten.
Ich wollte eine Funktion erstellen, die einen Datenrahmen und einen Vektor von Spaltennamen (als Zeichenfolgen) aufnehmen kann, die von einer Zeichenfolge in ein Datumsobjekt konvertiert werden sollen. Ich konnte nicht herausfinden, wie ich
as.Date()
ein Argument, das eine Zeichenfolge ist, in eine Spalte konvertieren kann, also habe ich es wie unten gezeigt gemacht.Unten ist, wie ich dies über SE mutate (
mutate_()
) und das.dots
Argument gemacht habe. Kritikpunkte, die dies verbessern, sind willkommen.quelle
Obwohl ich dplyr gerne für die interaktive Verwendung verwende, finde ich es außerordentlich schwierig, dies mit dplyr zu tun, da Sie die Rahmen durchlaufen müssen, um die Problemumgehungen für lazyeval :: interp (), setNames usw. zu verwenden.
Hier ist eine einfachere Version mit Base R, in der es mir zumindest intuitiver erscheint, die Schleife in die Funktion einzufügen, und die die Lösung von @ MrFlicks erweitert.
quelle
dplyr
in nicht interaktiven Einstellungen immer noch viel verwende, verwendet die Verwendung mit variabler Eingabe innerhalb einer Funktion eine sehr klobige Syntax.Möglicherweise genießen Sie ein Paket,
friendlyeval
das eine vereinfachte API und Dokumentation für neuere / gelegentlichedplyr
Benutzer enthält.Sie erstellen Zeichenfolgen, die Sie
mutate
als Spaltennamen behandeln möchten . Mitfriendlyeval
könnte man also schreiben:Was unter der Haube
rlang
Funktionen aufruft , die prüfen,varname
ist als Spaltenname zulässig.friendlyeval
Mit einem RStudio-Add-In kann der Code jederzeit in einen gleichwertigen Code umgewandelt werden.quelle