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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:20:44