使用 rename_all 从列名中删除后缀?
Removing suffix from column names using rename_all?
我有一个包含多个列的数据框,格式为 var1.mean、var2.mean。我想从包含它的所有列中删除后缀“.mean”。我尝试在管道中将 rename_all 与正则表达式结合使用,但无法提出正确的语法。有什么建议么?
以下适合我
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
您可以使用 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
文本位于字符串中间,则不会被替换)。
如果您想使用 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$", "", .)))
我会使用 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)
我们可以使用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)))))
已经给出了很多快速答案,对我来说最直观的是:
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"
您可以使用 gsub
.
colnames(df) <- gsub('.mean','',colnames(df))
使用新的 dplyr:
df %>% rename_with(~str_remove(., '.mean'))
我有一个包含多个列的数据框,格式为 var1.mean、var2.mean。我想从包含它的所有列中删除后缀“.mean”。我尝试在管道中将 rename_all 与正则表达式结合使用,但无法提出正确的语法。有什么建议么?
以下适合我
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
您可以使用 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
文本位于字符串中间,则不会被替换)。
如果您想使用 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$", "", .)))
我会使用 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)
我们可以使用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)))))
已经给出了很多快速答案,对我来说最直观的是:
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"
您可以使用 gsub
.
colnames(df) <- gsub('.mean','',colnames(df))
使用新的 dplyr:
df %>% rename_with(~str_remove(., '.mean'))