使用查找数据框以编程方式重命名数据框列

时间:2017-08-16 15:19:24

标签: r dataframe dplyr tidyverse

使用查找数据框批量重命名列的最佳方法是什么?

我可以将它作为管道的一部分吗?

library(tidyverse)

df <- data_frame(
  a = seq(1, 10)
  , b = seq(10, 1)
  , c = rep(1, 10)
)

df_lookup <- data_frame(
  old_name = c("b", "c", "a")
  , new_name = c("y", "z", "x")
)

我知道如何手动完成

df %>% 
  rename(x = a
    , y = b
    , z = c)

我正在寻找tidyverse / dplyr个套餐中的解决方案。

3 个答案:

答案 0 :(得分:4)

使用rlang;首先使用syms建立名称列表,然后使用renameUQS运算符将参数拼接到!!!

library(rlang); library(dplyr)

df %>% rename(!!!syms(with(df_lookup, setNames(old_name, new_name))))

# A tibble: 10 x 3
#       x     y     z
#   <int> <int> <dbl>
# 1     1    10     1
# 2     2     9     1
# 3     3     8     1
# 4     4     7     1
# 5     5     6     1
# 6     6     5     1
# 7     7     4     1
# 8     8     3     1
# 9     9     2     1
#10    10     1     1

答案 1 :(得分:1)

您可以编写自己的助手以使其更容易

rename_to <- function(data, old, new) {
  data %>% rename_at(old, function(x) new[old==x])
}

df %>% rename_to(df_lookup$old_name, df_lookup$new_name)

答案 2 :(得分:1)

在base-R中:

names(df)[match(df_lookup$old_name,names(df))] <- df_lookup$new_name

# # A tibble: 10 x 3 
#        x     y     z 
#    <int> <int> <dbl> 
#  1     1    10     1 
#  2     2     9     1 
#  3     3     8     1 
#  4     4     7     1 
#  5     5     6     1 
#  6     6     5     1 
#  7     7     4     1 
#  8     8     3     1 
#  9     9     2     1 
# 10    10     1     1

使用data.table

library(data.table)
setnames(setDT(df), old = df_lookup$old_name, new = df_lookup$new_name)

#      x  y z 
#  1:  1 10 1 
#  2:  2  9 1 
#  3:  3  8 1 
#  4:  4  7 1 
#  5:  5  6 1 
#  6:  6  5 1 
#  7:  7  4 1 
#  8:  8  3 1 
#  9:  9  2 1 
# 10: 10  1 1