如何在R语言中去除Range列中间数字并保留单个连字符
解决R中Range列保留首尾数字及单个连字符的问题
原始数据
df<-read.table (text=" ID Range 1 1-2-3 2 1-2-3 3 4-5-6 4 4-5-7 5 10-11-12 6 10-11-12 7 14-16-17 8 19-20-21 9 10-11-12 10 12-13-14 ", header=TRUE)
需求目标
将Range列中的中间数字移除,仅保留首尾数字和一个连字符,最终得到如下表格:
ID Range 1 1-3 2 1-3 3 4-6 4 4-7 5 10-12 6 10-12 7 14-17 8 19-21 9 10-12 10 12-14
问题分析
你之前使用的gsub("-", "", df$Range)会直接删除所有连字符,无法实现保留单个连字符的需求,因为该操作没有针对中间的数字部分做处理。
解决方案
方法1:正则表达式精准替换
使用gsub匹配-数字-的中间部分,替换为单个连字符:
df$Range <- gsub("-(\\d+)-", "-", df$Range)
正则说明:-(\\d+)-匹配以-开头、中间包含1个或多个数字、结尾为-的片段,将其替换为单个-,直接保留首尾数字和所需的连字符。
方法2:拆分重组字符串
如果对正则表达式不熟悉,可通过拆分字符串后取首尾元素重组:
df$Range <- sapply(strsplit(df$Range, "-"), function(x) paste(x[1], x[length(x)], sep = "-"))
逻辑说明:strsplit将每个Range字符串按-拆分为数字向量,取向量的第一个和最后一个元素,再用paste拼接成带单个连字符的字符串。
验证结果
运行上述任意一种方法后,执行print(df)即可得到目标表格。
内容的提问来源于stack exchange,提问作者user330
相关产品推荐
相关产品推荐

