使用rename_all函数如何从列名中去掉后缀?

18

我有一个数据框,其中包含一些以var1.mean、var2.mean的形式命名的列。 我想从包含".mean"后缀的所有列中删除该后缀。 我尝试使用管道中的rename_all与regex结合使用,但无法找到正确的语法。 有什么建议吗?

8个回答

29

使用新的dplyr:

df %>% rename_with(~str_remove(., '.mean'))

我认为这也需要使用stringr库来进行str_remove操作。 - Bradford
这也需要在末尾加上美元符号(例如 ".mean$"),以指明模式需要匹配列名的末尾(即后缀)。 - Dr Bala Soundararaj

29
如果您想使用dplyr包,我建议使用rename_at函数。
Dframe <- data.frame(var1.mean = rnorm(10),
                     var2.mean = rnorm(10),
                     var1.sd = runif(10))

library(dplyr)

Dframe %>% 
  rename_at(.vars = vars(ends_with(".mean")),
            .funs = funs(sub("[.]mean$", "", .)))

在rename_at()函数内,为什么要包括.vars和.funs? - axme100
1
这些是传递给 rename_at 函数的参数名。 - Benjamin
3
funsrename_at 已经被弃用/替代。现在你应该使用rename_with(~ gsub("[.]mean$", "", .x) - Brian D

10
我们可以使用rename_all
df1 %>%
   rename_all(.funs = funs(sub("\\..*", "", names(df1)))) %>%
   head(2)
#        var1        var2       var3       var1       var2       var3
#1 -0.5458808 -0.09411013  0.5266526 -1.3546636 0.08314367  0.5916817
#2  0.5365853 -0.08554095 -1.0736261 -0.9608088 2.78494703 -0.2883407

注意:如果列名重复,则需要使用make.unique使其唯一。

数据

set.seed(24)
df1 <- as.data.frame(matrix(rnorm(25*6), 25, 6, dimnames = list(NULL,
             paste0(paste0("var", 1:3), rep(c(".mean", ".sd"), each = 3)))))

9

你可以使用gsub函数。

colnames(df) <- gsub('.mean','',colnames(df))

1
以下内容对我来说可行。
dat <- data.frame(var1.mean = 1, var2.mean = 2)
col_old <- colnames(dat)
col_new <- gsub(pattern = ".mean",replacement = "", x  = col_old)
colnames(dat) <- col_new

使用 pattern = "[.]mean$" 将确保您只更改以 .mean 结尾的变量名。 - Benjamin

1
您可以使用stringi包中的stri_replace_last_regex函数来替换这些名称,例如:
require(stringi)
df <- data.frame(1,2,3,4,5,6)
names(df) <- stri_paste("var",1:6,c(".mean",".sd"))
df
##  var1.mean var2.sd var3.mean var4.sd var5.mean var6.sd
##1         1       2         3       4         5       6
names(df) <- stri_replace_last_regex(names(df),"\\.mean$","")
df
##  var1 var2.sd var3 var4.sd var5 var6.sd
##1    1       2    3       4    5       6

正则表达式是\\.mean$,因为你需要转义点字符(它在正则表达式中有特殊含义),并且你还可以在末尾添加$符号,以确保你只替换以这个模式结尾的名称(如果.mean文本出现在字符串中间,则不会被替换)。

0
我会使用字符串分割函数:
x <- as.data.frame(matrix(runif(16), ncol = 4))
colnames(x) <- c("var1.mean", "var2.mean", "var3.mean", "something.else")

colnames(x) <- strsplit(colnames(x), split = ".mean")
colnames(x)

0

已经给出了很多快速答案,对我来说最直观的是:

Dframe <- data.frame(var1.mean = rnorm(10),        #Create Example
                     var2.mean = rnorm(10),
                     var1.sd = runif(10))
names(Dframe) <- gsub("[.]mean","",names(Dframe))  #remove ".mean"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接