R语言中如何去除数据框列名开头的第一组数字前缀
解决方案
原代码出错的核心是正则里的.*默认走贪婪匹配模式,会从字符串开头一路匹配到整串里最后一个下划线的位置,才导致中间的内容被误删。两种改法都能实现需求:
方法1(推荐,匹配逻辑最精准)
直接写正则精准匹配「开头的连续数字+紧跟的第一个下划线」,完全不会误匹配其他位置的内容,正则规则为^\\d+_:
^锚定字符串的起始位置,确保只从串头开始匹配\\d+匹配开头位置1个及以上的连续数字,也就是你要删掉的第一组数字_匹配这组数字后面紧接的第一个下划线
对应修改后的代码:
names(df)[1:2] <- gsub("^\\d+_", "", names(df)[1:2])
注:原代码里写
names(df[,c(1:2)])是多余操作,直接取names(df)[1:2]即可,不需要对子集数据框取列名,运行效率更高。
方法2(非贪婪匹配改法)
如果要沿用原来的通配符写法,给通配符加非贪婪限定符?,让.*匹配到第一个符合条件的下划线就停止,不会往后贪婪匹配,对应代码:
names(df)[1:2] <- gsub("^.*?_", "", names(df)[1:2])
这个方法不推荐优先用——如果未来列名开头数字和第一个下划线之间出现其他非数字字符,也会被一并删掉,容错性不如方法1。
效果验证
拿你举的两个示例列名跑上述代码,输出结果完全符合预期:
- 原列名
20819830_r1ar_u_stationary→ 处理后:r1ar_u_stationary - 原列名
2081974_f8ar_u→ 处理后:f8ar_u
内容的提问来源于stack exchange,提问作者Kristen Cyr
相关产品推荐
相关产品推荐

