web-dev-qa-db-fra.com

Supprimer le suffixe des noms de colonne en utilisant rename_all?

J'ai un cadre de données avec un certain nombre de colonnes dans un formulaire var1.mean, var2.mean. Je souhaite supprimer le suffixe ".mean" de toutes les colonnes qui le contiennent. J'ai essayé d'utiliser rename_all conjointement avec regex dans un tube, mais je n'ai pas pu trouver une syntaxe correcte. Aucune suggestion?

8
linda

Si vous souhaitez utiliser le package dplyr, je vous recommande d'utiliser la fonction 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$", "", .)))
9
Benjamin

Nous pouvons utiliser 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

REMARQUE: Si les noms de colonnes sont dupliqués, vous devez le rendre unique avec make.unique.

les données

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)))))
7
akrun

Le ci-dessous fonctionne pour moi

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
1
shaojl7

Vous pouvez remplacer ces noms en utilisant la variable stringi package stri_replace_last_regex comme ceci:

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

La regex est \\.mean$ car vous devez échapper au caractère point (il a une signification spéciale dans regex) et vous pouvez également ajouter le signe $ à la fin pour vous assurer de ne remplacer que les noms comportant ENDS avec ce modèle (si le texte .mean est au milieu). de chaîne alors il ne sera pas remplacé).

1
bartektartanus

Beaucoup de réponses rapides ont été données, la plus intuitive à mes yeux serait:

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"
0
Jan Felix

J'utiliserais stringsplit:

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
Rieneke