web-dev-qa-db-ja.com

rename_allを使用して列名からサフィックスを削除しますか?

Var1.mean、var2.meanという形式の列が複数あるデータフレームがあります。それを含むすべての列から接尾辞「.mean」を取り除きたいのですが。パイプ内でregexと一緒にrename_allを使用してみましたが、正しい構文を思い付くことができませんでした。助言がありますか?

11
linda

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$", "", .)))
14
Benjamin

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
akrun

以下は私のために働きます

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

次のように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$です。これは、ドット文字をエスケープする必要があるためです(正規表現では特別な意味があります)。また、末尾に$記号を追加して、ENDSの名前のみをこのパターン( .meanテキストが文字列の途中にある場合、置換されません)。

1
bartektartanus

多くの迅速な回答が与えられましたが、最も直感的には次のようになります。

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

私は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