通过R中的查找表重命名变量

通过R中的查找表重命名变量,r,dplyr,tidyverse,purrr,R,Dplyr,Tidyverse,Purrr,我有一个特定顺序的数据帧: 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 假设rename_at是正确的方法,但这不起作用。我想知道purrr::map.*是否是正确的方法,但不知道如何

我有一个特定顺序的数据帧:

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

假设rename_at是正确的方法,但这不起作用。我想知道
purrr::map.*
是否是正确的方法,但不知道如何。非常感谢您的建议。

这里是一个单线
基本解决方案:

names(df2) = variable_match$new[match(names(df), variable_match$old)]
它可能不适合您(它不需要使用
tidyverse
),但它很简单,不需要加载任何额外的包,而是依赖于常见的内置函数


如注释中所述,如果您更喜欢带有管道的嵌套语句(管道不是为了提高可读性和防止嵌套吗?)

library(purrr)
library(dplyr)
library(magrittr)
df = df %>%
    set_names(
        var_match %>%
        pull(new) %>%
        extract(
            names(df) %>% 
            match(var_match$old)
        )
    )
我非常喜欢使用管道和
dplyr
——当管道使事情变得更简单、更可读时,我会一直使用它们。在这种情况下,他们把一条简单的线,并把它变成一个编程难题,无论是在如何编写它和如何读取它


总体而言,更好的接口是
data.table::setnames
函数。如果您转换为数据表,那么代码是
setnames(df,old=var\u match$old,new=var\u match$new)
。在并非所有名称都发生更改的情况下,这一功能非常强大(请参见下面的注释)。

我对Gregor的答案进行了功能化处理,以便在管道中轻松使用:

lookup_rename <- function(df, column_lookup) {
  df2 <- df
  # using Gregor's answer (https://stackoverflow.com/a/43742442/3927208)
  names(df2) = column_lookup$new[match(names(df), column_lookup$old)]
  df2
}

lookup\u rename如何使用
plyr::mapvalues
也许可以,但我无法在(变量匹配$old,函数(x)变量匹配$new[variable\u匹配$old==x])测试它
df%>%rename\u。我认为@Gregor的答案很好,因为您可以使用dplyr 0.6轻松移植Gregor的答案:
df%>%rename\u all(funs(variable\u match$new[match(,variable\u match$old)])
。您还可以执行
df%>%重命名(!!!setNames(rlang::syms(as.character(variable\u match$old)),variable\u match$new))
,尽管我很确定有一个更优雅的版本,它是
:=
,我不知道如何编写的。@alistaire谢谢,这基本上就是我想要的。看起来我需要在
rlang
下一代软件包
rename(df,.dots=setNames(as.character(variable\u match$old),variable\u match$new))
谢谢-这可以通过上面的alistaire评论直接移植到
tidyverse
,或者
df%>%set\u names(variable\u match%>%pull(new)%%>%magrittr::extract(名称(df)%%>%match(var_match$old))
这可以工作,但是如果有一些列不匹配怎么办。例如,查找表只引用原始数据框中80%的字段。如果在我的查找表中找不到该名称,则我不想重命名它,但会将该名称保留为。此映射为不在查找中的字段提供NA名称table@runningbirds是的,OP的问题都是关于重新排序,而不是关于部分替换。您可以进行一些小的修改,以便只替换匹配的名称:(调用查找表
vm
names(df2)[names(df2)%in%vm$old]=vm$new[match(names(df2)[names(df2)%in%vm$old],vm$old)]
library(purrr)
library(dplyr)
library(magrittr)
df = df %>%
    set_names(
        var_match %>%
        pull(new) %>%
        extract(
            names(df) %>% 
            match(var_match$old)
        )
    )
lookup_rename <- function(df, column_lookup) {
  df2 <- df
  # using Gregor's answer (https://stackoverflow.com/a/43742442/3927208)
  names(df2) = column_lookup$new[match(names(df), column_lookup$old)]
  df2
}