使用 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
我是初级 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