如何用正则表达式去除R语言数据框列名中的多余编号?
移除R数据框列名中的后缀编号(保留重复列)
我需要处理一个R数据框,要移除列名里的后缀编号(比如Event.1、Event.2这类),同时保留重复的Event列。已知Python中可以用re.sub实现:
df.columns = [re.sub("(.*?)(\\.\\d+)", "\\\\1", c) for c in df.columns]
寻求对应的R语言实现方式。
原数据框代码
df <- data.frame( Name = c("Jim","Jim","Jim","Jim","Jim","Jim","Jim","Jim","Jim","Jim", "Sue","Sue","Sue","Sue","Sue","Sue","Sue","Sue","Sue","Sue"), Dates = c("2010-1-1", "2010-1-2", "2010-01-5","2010-01-17","2010-01-20", "2010-01-29","2010-02-6","2010-02-9","2010-02-16","2010-02-28", "2010-1-1", "2010-1-2", "2010-01-5","2010-01-17","2010-01-20", "2010-01-29","2010-02-6","2010-02-9","2010-02-16","2010-02-28"), Event.1 = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), Event.2 = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), Event.3 = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1))
目标数据框效果
df <- data.frame( Name = c("Jim","Jim","Jim","Jim","Jim","Jim","Jim","Jim","Jim","Jim", "Sue","Sue","Sue","Sue","Sue","Sue","Sue","Sue","Sue","Sue"), Dates = c("2010-1-1", "2010-1-2", "2010-01-5","2010-01-17","2010-01-20", "2010-01-29","2010-02-6","2010-02-9","2010-02-16","2010-02-28", "2010-1-1", "2010-1-2", "2010-01-5","2010-01-17","2010-01-20", "2010-01-29","2010-02-6","2010-02-9","2010-02-16","2010-02-28"), Event = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), Event = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1), Event = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1))
R语言实现方案
方法1:Base R 的 sub() 函数
直接使用R内置的正则替换函数sub(),匹配列名中.数字的后缀并替换为空,保留前缀部分:
# 替换列名 colnames(df) <- sub("(.*?)\\.\\d+", "\\1", colnames(df))
- 正则表达式说明:
(.*?)匹配任意字符(非贪婪模式),\\.\\d+匹配小数点加一个或多个数字;\\1引用第一个捕获组的内容(即前缀部分)。 - R的数据框允许重复列名,因此替换后会保留多个
Event列,符合需求。
方法2:使用 stringr 包(更简洁)
如果习惯用tidyverse风格的函数,可以用stringr包的str_replace():
library(stringr) colnames(df) <- str_replace(colnames(df), "(.*?)\\.\\d+", "\\1")
内容的提问来源于stack exchange,提问作者John Conor
相关产品推荐
相关产品推荐

