如何使用 rename_with 或重命名使用字符串向量重命名数据框的最后 n 列?

How to rename last n columns of dataframe with vector of strings, using rename_with or rename?

我正在使用 rename_at,但由于它已被取代,我需要找到一种方法来使用 rename_with() 或 rename()

library(tidyverse)

df <- tibble(
  a = 1:10,
  b = 1:10,
  c = 1:10,
  d = 1:10,
  e = 1:10
)

new_names <- c("1", "2", "4", "5", "10")

df %>% 
  rename_at(vars(names(.) %>% tail(5)), funs(paste0("", new_names))) # only `funs(new_names)` won't work

使用rename_with

library(dplyr)
library(stringr)
df %>% 
    rename_with(~ str_c(., new_names), tail(names(.), 5))
# A tibble: 10 x 5
#      a1    b2    c4    d5   e10
#   <int> <int> <int> <int> <int>
# 1     1     1     1     1     1
# 2     2     2     2     2     2
# 3     3     3     3     3     3
# 4     4     4     4     4     4
# 5     5     5     5     5     5
# 6     6     6     6     6     6
# 7     7     7     7     7     7
# 8     8     8     8     8     8
# 9     9     9     9     9     9
#10    10    10    10    10    10

rename

df %>% 
     rename(!!! setNames(tail(names(.), 5), new_names))

或者直接在names

tail上使用rename_at
df %>% 
      rename_at(vars(tail(names(.), 5)), ~ str_c(., new_names))

-输出

# A tibble: 10 x 5
#      a1    b2    c4    d5   e10
#   <int> <int> <int> <int> <int>
# 1     1     1     1     1     1
# 2     2     2     2     2     2
# 3     3     3     3     3     3
# 4     4     4     4     4     4
# 5     5     5     5     5     5
# 6     6     6     6     6     6
# 7     7     7     7     7     7
# 8     8     8     8     8     8
# 9     9     9     9     9     9
#10    10    10    10    10    10

如果只是替换名字

df %>% 
    rename_at(vars(tail(names(.), 5)), ~ new_names)
# A tibble: 10 x 5
#     `1`   `2`   `4`   `5`  `10`
#   <int> <int> <int> <int> <int>
# 1     1     1     1     1     1
# 2     2     2     2     2     2
# 3     3     3     3     3     3
# 4     4     4     4     4     4
# 5     5     5     5     5     5
# 6     6     6     6     6     6
# 7     7     7     7     7     7
# 8     8     8     8     8     8
# 9     9     9     9     9     9
#10    10    10    10    10    10

在示例中,只有 5 列。假设,如果只是最后3列

df %>%
   rename_at(vars(tail(names(.), 3)), ~ str_c(., tail(new_names, 3)))

funs 接受一个函数,所以用 paste0as.character 包装而不只是输入向量

基础 R 方法:

n <- ncol(df)
names(df)[(n-4):n] <- new_names
df

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