根据模式匹配R重命名列名

时间:2017-10-02 14:21:34

标签: r loops dataframe gsub

假设我有以下数据框:

xx2xx30x4xx <- rep(5,30)
yyyy3yy50y5yyy <- rep(4,30)
zz12zzzz70z8zz <- rep(7,30)
df <- data.frame(xx2xx30x4xx,yyyy3yy50y5yyy,zz12zzzz70z8zz)

我想重命名列名,以便它们只包含两者之间的最大数字。我想过用gsub / grep和一个循环来做,例如: 这会返回列名

grep(pattern = "[50-100]", x = colnames(df), value= T )

现在,我希望列名等于匹配的模式,即50-100而不是更小的数字。这可能吗?如果没有,您是否知道如上所述重命名列的其他通用方法?提前致谢。

1 个答案:

答案 0 :(得分:1)

xxxxxx30xxxx <- rep(5,30)
yyyyyyy50yyyyy <- rep(4,30)
zzzzzzz70zzzz <- rep(7,30)
df <- data.frame(zzzzzzz70zzzz,yyyyyyy50yyyyy,xxxxxx30xxxx)

grep(pattern = "[0-100]", x = colnames(df), value= T )

new_colnames <- gsub("\\D", "", colnames(df))
colnames(df) <- new_colnames

我希望我理解正确。 gsub命令会删除列名称中不是数字的所有内容,因此您可以在中间删除数字。

修改

此代码匹配字符串中30位数到70之间的两位数字,并将其解压缩。

xxxxxx30xxxx <- rep(5,30)
yyyyyyy50yyyyy <- rep(4,30)
zzzzzzz70zzzz <- rep(7,30)
df <- data.frame(zzzzzzz70zzzz,yyyyyyy50yyyyy,xxxxxx30xxxx)

grep(pattern = "[0-100]", x = colnames(df), value= T )

# new_colnames <- gsub("\\D", "", colnames(df))

new_colnames <- regmatches(colnames(df), regexpr("([3-6][0-9])|([7][0])",colnames(df)))

colnames(df) <- new_colnames

这里有关于正则表达式和字符串操作的一些信息:

https://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html

https://www.regular-expressions.info/rlanguage.html