R语言:移除DataFrame列中数字范围的分隔符及后续内容
提取数字范围的起始数值(dplyr优先方案)
需求背景
处理DataFrame的Number列,该列包含两种数字范围格式:
- 负数范围:如
-500--550(连字符--表示“到”) - 正负/正数范围:如
-100-200、200-400(连字符-表示“到”)
需要移除表示“到”的连字符及其后所有内容,仅保留范围的起始数值。
测试数据
testing <- structure(list(Name = c("A", "B", "C", "D", "E", "F", "G"), Number = c("-500--550", "-600--650", "-700--750", "-8000--8500", "-9000--9500", "-100-200", "200-400")), class = "data.frame", row.names = c(NA, -7L))
问题分析
之前尝试的str_remove(testing$Number, "\\--[^-]*$")仅能处理--分隔的负数范围,无法匹配单个-分隔的行(如F、G行),导致这部分数据未被正确处理。
解决方案(dplyr + stringr)
直接提取字符串开头的可选负号+数字部分,无需区分不同的连字符分隔符,适配所有格式:
library(dplyr) library(stringr) # 生成新列存储起始数值 result <- testing %>% mutate(Start_Number = str_extract(Number, "^-?\\d+"))
运行结果
print(result) # Name Number Start_Number # 1 A -500--550 -500 # 2 B -600--650 -600 # 3 C -700--750 -700 # 4 D -8000--8500 -8000 # 5 E -9000--9500 -9000 # 6 F -100-200 -100 # 7 G 200-400 200
正则说明
^-?\\d+ 的具体含义:
^:锚定字符串开头,确保只提取最前面的数值-?:匹配可选的负号(处理负数情况)\\d+:匹配一个或多个数字(覆盖任意位数的整数)
备选Base R方案
如果不依赖dplyr/stringr,也可以用base R的gsub实现:
testing$Start_Number <- gsub("(-?\\d+)-.*", "\\1", testing$Number)
内容的提问来源于stack exchange,提问作者Corey
相关产品推荐
相关产品推荐

