更新:来自本帖下方评论的信息,现在已经按照预期工作,没有我在此处提出的问题。
以下是使用dplyr中的rename_
的玩具示例。我希望能够通过下面的第二个示例更改列名回到原始名称,但我猜想函数参数评估规则以某种方式阻止了它按照我的想法工作。使用原始的plyr包rename
函数(以及使用基本包names
函数)有一个简单的解决方法,但我觉得我错过了dplyr的解决方案。
我已经展示了一个解决方法,但我欢迎解决第二个示例按照我的期望工作的方法,或者解释为什么我不应该期望它按照我想要的方式工作。
谢谢, Matt
编辑:我添加了下面的一个示例,使用rename_
使其工作,但很复杂。我假设如果Hadley所提到的错误得到修复,这将按照他所展示的方式工作。但在那之前,我尴尬的方法确实可以用,但使用标准的plyr
方法可能更好。还添加了基于R的技术以实现完整性。
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
rename_(dat, .dots = setNames(x, "new"))
现在按预期工作。 - cboettig