【发布时间】:2017-05-02 15:58:04
【问题描述】:
我有一个特定顺序的数据框:
df <-
data.frame(
foo = 1:3,
bar = LETTERS[1:3],
baz = rnorm(3)
)
df
foo bar baz
1 1 A 0.41474174
2 2 B -0.08416768
3 3 C -0.27931232
在另一个数据框中,我将旧变量名称与一些新名称匹配,但顺序不同:
variable_match <-
data.frame(
old = names(df)[c(2, 3, 1)],
new = LETTERS[1:3]
)
variable_match
old new
1 bar A
2 baz B
3 foo C
我的问题是:如何通过在第二个数据框中查找相应的值来重命名原始数据框中的变量。理想情况下,我正在寻找tidyverse 解决方案。我尝试了以下变体:
library(tidyverse)
df %>% rename_at(variable_match$old, funs(variable_match$new))
假设 rename_at 是正确的方法,但这不起作用。我想知道purrr::map_* 是否是正确的方法,但不知道如何。非常感谢您的建议。
【问题讨论】:
-
如何使用
plyr::mapvalues -
也许这行得通,但我无法测试它
df %>% rename_at(variable_match$old, function(x) variable_match$new[variable_match$old == x])。我认为@Gregor 的回答很好 -
您可以使用 dplyr 0.6 轻松移植 Gregor 的答案:
df %>% rename_all(funs(variable_match$new[match(., variable_match$old)]))。你也可以使用df %>% rename(!!!setNames(rlang::syms(as.character(variable_match$old)), variable_match$new)),尽管我很确定:=有一个更优雅的版本,我不知道该怎么写。 -
@alistaire 谢谢,这基本上就是我想要的。看起来我接下来需要了解
rlang包 -
还有
rename_(df, .dots = setNames(as.character(variable_match$old), variable_match$new))