使用 dplyr 重命名具有唯一名称的多个列的快速方法

A quick way to rename multiple columns with unique names using dplyr

我是初级 R 用户,目前正在学习 tidyverse 方法。我导入了一个数据集,它是四年内月度指数消费者价格的时间序列。每月 CPI 列上的导入标题在 R 中显示为五位数字(作为字符)。这是它的外观的简短模型重现...

df <- tibble(`Product` = c("Eggs", "Chicken"),
              `44213` = c(35.77, 36.77),
              `44244` = c(39.19, 39.80),
              `44272` = c(40.12, 43.42),
              `44303` = c(41.09, 41.33)
)

# A tibble: 2 x 5
#  Product `44213` `44244` `44272` `44303`
#  <chr>     <dbl>   <dbl>   <dbl>   <dbl>
#1 Eggs       35.8    39.2    40.1    41.1
#2 Chicken    36.8    39.8    43.4    41.3

我想将列标题(44213 等)更改为对我来说更有意义的日期(仍然是字符)。我理解,使用 dplyr,按以下方式进行:

df <- df %>% rename("Jan17" = `44213`, "Feb17" = `44244`, 
                    "Mar17" = `44272`, "Apr17" = `44303`)

# A tibble: 2 x 5
#  Product Jan17 Feb17 Mar17 Apr17
#  <chr>   <dbl> <dbl> <dbl> <dbl>
#1 Eggs     35.8  39.2  40.1  41.1
#2 Chicken  36.8  39.8  43.4  41.3

问题是我的实际数据集包含 48 个这样的列(月)要重命名,因此输入很多工作。我查看了其他替换和 set_names 函数,但这些函数似乎添加了对列名称的重复更改,不像我正在寻找的那样提供新的唯一名称?

(我意识到日期作为列不是好的做法,需要在继续任何分析之前将它们移动到行...或者这可能必须是重命名的先验步骤?)

相信我已经充分表达了我的问题。很想使用 dplyr 学习更快的解决方案,或者被引导到可以找到的地方。谢谢你的时间。

我们可以通过传递命名向量

!!!rename一起使用
library(dplyr)
library(stringr)
df1 <- df %>% 
     rename(!!! setNames(names(df)[-1], str_c(month.abb[1:4], 17)))

-输出

df1
# A tibble: 2 x 5
#  Product Jan17 Feb17 Mar17 Apr17
#  <chr>   <dbl> <dbl> <dbl> <dbl>
#1 Eggs     35.8  39.2  40.1  41.1
#2 Chicken  36.8  39.8  43.4  41.3

或使用rename_with

df %>% 
     rename_with(~str_c(month.abb[1:4], 17), -1)

如果列名应该转换成Date格式

nm1 <- format(as.Date(as.numeric(names(df)[-1]), origin = '1896-01-01'), '%b%y')

df %>%
    rename_with(~ nm1, -1)
# A tibble: 2 x 5
#  Product Jan17 Feb17 Mar17 Apr17
#  <chr>   <dbl> <dbl> <dbl> <dbl>
#1 Eggs     35.8  39.2  40.1  41.1
#2 Chicken  36.8  39.8  43.4  41.3

使用一些随机名称,但顺序

names(df)[2:ncol(df)] <- paste0('col_', 1:(ncol(df)-1), sep = '')

## A tibble: 2 x 5
#  Product col_1 col_2 col_3 col_4
#  <chr>   <dbl> <dbl> <dbl> <dbl>
#1 Eggs     35.8  39.2  40.1  41.1
#2 Chicken  36.8  39.8  43.4  41.3