You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用正则表达式去除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 08:15:30