在 R 中重命名多列

1 r tidyverse

我希望这不是一个重复的问题,因为我找不到我有兴趣使用的答案。我有 70 列,我想重命名它们。我知道几种方法作为例子:

df1<-setmames (df1, c("BA1", "MA2", "NA3"...), c( "AB1","QB2","Q3"...))
Run Code Online (Sandbox Code Playgroud)

但是这些方法没有帮助,因为我们有一个非常大的脚本。我想知道我们是否可以使用tidyverse?

举个例子,我可以显示三列,假设我有这个表:

AB1	AB2	AB3
12	13	13
12	13	13
12	11	13
12	13	17
12	13	16
Run Code Online (Sandbox Code Playgroud)

我想要这张桌子

MZ1	MZ2	MZ3
12	13	13
12	13	13
12	11	13
12	13	17
12	13	16
Run Code Online (Sandbox Code Playgroud)

考虑到这只是一个例子,我有 70 列。

akr*_*run 5

我们可以使用索引或列名

names(df1)[1:70] <- v1
Run Code Online (Sandbox Code Playgroud)

在哪里

 v1<- c("AB1", "QB2", ...)
Run Code Online (Sandbox Code Playgroud)

有了dplyr,我们可以使用rename_at

library(dplyr)
library(stringr)
df1 <- df1 %>%
          rename_at(1:70, ~ v1)
Run Code Online (Sandbox Code Playgroud)

如果我们重命名以“AB”开头的列

names(df1)
#[1] "x1"  "x2"  "AB1" "AB2"

df1 %>%
   rename_at(vars(matches('^AB\\d+$')), ~ str_replace(., 'AB', 'MZ'))
#  x1 x2        MZ1       MZ2
#1  1  6 -0.5458808 0.6048889
#2  2  7  0.5365853 0.3707349
#3  3  8  0.4196231 0.6716903
#4  4  9 -0.5836272 0.6729823
#5  5 10  0.8474600 0.3204306
Run Code Online (Sandbox Code Playgroud)

或者在 base R

i1 <- grep("^AB\\d+$", names(df1))
names(df1)[i1] <- sub("AB", "MZ", names(df1)[i1])
Run Code Online (Sandbox Code Playgroud)

更新

df2 <- df2 %>%
         rename_at(vars(matches("^AB\\d+$")), ~ str_replace(., "AB", "MZ"))
df2
#  MZ1 MZ2 MZ3
#1  12  13  13
#2  12  13  13
#3  12  11  13
#4  12  13  17
#5  12  13  16
Run Code Online (Sandbox Code Playgroud)

数据

set.seed(24)
df1 <- data.frame(x1 = 1:5, x2 = 6:10, AB1 = rnorm(5), AB2 = runif(5))
Run Code Online (Sandbox Code Playgroud)

原始数据值

df1
#  x1 x2        AB1       AB2
#1  1  6 -0.5458808 0.6048889
#2  2  7  0.5365853 0.3707349
#3  3  8  0.4196231 0.6716903
#4  4  9 -0.5836272 0.6729823
#5  5 10  0.8474600 0.3204306
Run Code Online (Sandbox Code Playgroud)

来自 OP 帖子的更新数据

df2 <- structure(list(AB1 = c(12L, 12L, 12L, 12L, 12L), AB2 = c(13L, 
 13L, 11L, 13L, 13L), AB3 = c(13L, 13L, 13L, 17L, 16L)),
  class = "data.frame", row.names = c(NA, -5L))
Run Code Online (Sandbox Code Playgroud)