重命名包含特定字符串的所有列名

Rename all column names that include a certain string

假设我有一个包含 6 列的数据集,我想替换列名称中的字符串,包括字符串“likes_comment”到字符串“number_likes”。

示例数据:

da = data.frame(likes_comment_1 = c(1,2,3,4), likes_comment_2 = c(2,2,3,1), likes_comment_3=c(5,2,3,1), quotes_comment1=c(2,1,3,4), quotes_comment2_=c(3,5,7,1), quotes_comment3=c(2,3,1,2))

da
  likes_comment_1 likes_comment_2 likes_comment_3 quotes_comment1 quotes_comment2_ quotes_comment3
1               1               2               5               2                3               2
2               2               2               2               1                5               3
3               3               3               3               3                7               1
4               4               1               1               4                1               2

目标数据:

target_da = data.frame(number_likes_1 = c(1,2,3,4), number_likes_2 = c(2,2,3,1), number_likes_3=c(5,2,3,1), quotes_comment1=c(2,1,3,4), quotes_comment2_=c(3,5,7,1), quotes_comment3=c(2,3,1,2))

target_da
  number_likes_1 number_likes_2 number_likes_3 quotes_comment1 quotes_comment2_ quotes_comment3
1              1              2              5               2                3               2
2              2              2              2               1                5               3
3              3              3              3               3                7               1
4              4              1              1               4                1               2

我该怎么做?

这个有用吗:

names(da)[grepl('likes_comment',names(da))] <- gsub('likes_comment','number_likes',names(da)[grepl('likes_comment',names(da))])
da
  number_likes_1 number_likes_2 number_likes_3 quotes_comment1 quotes_comment2_ quotes_comment3
1              1              2              5               2                3               2
2              2              2              2               1                5               3
3              3              3              3               3                7               1
4              4              1              1               4                1               2

使用sub:

names(da) <- sub("likes_comment_(\d+)", "number_likes_\1", names(da))

你可以使用rename_with-

library(dplyr)
library(stringr)

da %>% rename_with(~str_replace(., 'likes_comment', 'number_likes'))

#  number_likes_1 number_likes_2 number_likes_3 quotes_comment1
#1              1              2              5               2
#2              2              2              2               1
#3              3              3              3               3
#4              4              1              1               4

#  quotes_comment2_ quotes_comment3
#1                3               2
#2                5               3
#3                7               1
#4                1               2

因为 OP 被标记为 data.table:

library(data.table)
setnames(da, sub('likes_comment', 'number_likes', names(da), fixed = TRUE))