UPDATE: Von Kommentar unten auf diesem Beitrag funktioniert das jetzt wie erwartet, ohne die Probleme, die ich hier dargelegt habe.dplyr 'rename' Standard-Evaluierungsfunktion funktioniert nicht wie erwartet?
Unten finden Sie ein Spielzeugbeispiel für die Verwendung von rename_
von dplyr. Ich habe erwartet, dass ich den Spaltennamen wieder in den ursprünglichen Namen ändern kann, indem ich das zweite Beispiel verwende, aber ich vermute, dass die Bewertungsregeln für Funktionsargumente irgendwie verhindern, dass es so funktioniert, wie ich denke. Es gibt eine einfache Umgehung mit dem ursprünglichen plyr-Paket rename
Funktion (sowie die Verwendung des Basispakets names
Funktion), aber ich habe das Gefühl, dass ich eine dplyr-Lösung zu diesem Thema vermisse.
Ich habe einen Workaround wie unten gezeigt, aber ich würde sowohl eine dplyr-Lösung für das zweite Beispiel, wie ich erwarte, oder eine Erklärung, warum ich nicht erwarten sollte, dass es so funktioniert, wie ich es will.
Danke, Matt
EDIT: Ich habe ein Beispiel unter rename_
mit dieser Arbeit zu machen, aber kompliziert. Ich nehme an, wenn der Fehler, auf den sich Hadley unten bezieht, behoben wird, wird dies funktionieren, wie er unten zeigt. Aber bis dahin ist meine peinliche Art, aber es ist wahrscheinlich besser, die Standardmethode plyr
zu verwenden. Zum Beispiel wurde auch die Basis-R-Technik am Ende hinzugefügt, zum Beispiel Vollständigkeit.
library(plyr)
library(dplyr)
# dataframe to operate on
dat <- data_frame(a=1, b=1)
# identifier with string of column name in dat
x <- "a"
# Renaming using standard evaluation this way works
dat %>%
rename_("new" = x)
# Source: local data frame [1 x 2]
#
# new b
# 1 1 1
# But changing it back does not
# I expect "a" to be the name, not the identifier x
dat %>%
rename_("new" = x) %>%
rename_(x = "new")
# Source: local data frame [1 x 2]
#
# x b
# 1 1 1
# This works, but seems really awkward...
dat %>%
rename_("newname" = x) %>%
do(do.call(rename_, setNames(list(., "newname"), c(".data", x))))
# Source: local data frame [1 x 2]
#
# a b
# 1 1 1
# This works fine
dat %>%
rename_("new" = x) %>%
plyr::rename(c("new" = x))
# Source: local data frame [1 x 2]
#
# a b
# 1 1 1
# Base R way
datrn <- dat %>%
rename_("newname" = x)
names(datrn)[names(datrn) == "newname"] = x
datrn
# Source: local data frame [1 x 2]
#
# a b
# 1 1 1
Falls sich jemand wundern sollte, 'rename_ (dat, .dots = setNames (x," neu "))' funktioniert jetzt wie erwartet. – cboettig
Weitere Informationen über diese Art von Sachen gibt es in der dplyr-Vignette auf Nicht-Standard-Bewertung: https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html – RobinL