【问题标题】:Programmatically rename data frame columns using lookup data frame使用查找数据框以编程方式重命名数据框列
【发布时间】:2018-01-24 19:44:42
【问题描述】:

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

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

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 软件包中的解决方案。

【问题讨论】:

  • names(df)[match(old_name,names(df))] &lt;- new_name 我很高兴这个问题之前已经回答过了。我记得赞成它。

标签: r dataframe dplyr tidyverse


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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)
    

    【讨论】:

      【解决方案3】:

      在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
      

      【讨论】:

        猜你喜欢
        • 2018-01-10
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多