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

R语言从字符串提取指定数字并完成除法运算的实现方法

R提取合同字符串计算年均薪实现方案

问题说明

现有数据框存储合同信息的列为字符串格式,样例内容如下:

Signed 1-yr/$2.5M deal with Pacers  
Signed 4-yr/$113M deal with Celtics 
Signed 3-yr/$30M deal with Pacers   

核心需求:

  • 提取-yr前的数字(合同年数)
  • 提取M前的数字(合同总金额,单位:百万美元)
  • 用总金额除以年数得到年均薪,预期输出结果为2.5、28.25、10

此前使用str_extract_all(df$col,"\\d")的缺陷是仅能匹配单个数字字符,既无法识别小数,也没有做目标位置定位,无法区分两个待提取数值。

实现代码(推荐stringr方案)

使用正则的正向/反向预查语法精准定位目标值,不会被字符串中其他无关数字干扰,且自动匹配数据框最后一列,无需手动输入列名:

# 加载依赖,如未安装可先运行 install.packages("tidyverse")
library(tidyverse)

# 数据处理
df <- df %>%
  mutate(
    # 提取-yr前的年数,转为数值格式
    contract_year = as.numeric(str_extract(last_col(), "(\\d+\\.?\\d*)(?=-yr)")),
    # 提取$和M之间的总金额,转为数值格式
    total_salary_m = as.numeric(str_extract(last_col(), "(?<=\\$)(\\d+\\.?\\d*)(?=M)")),
    # 计算年均薪
    avg_salary_m = total_salary_m / contract_year
  )

运行结果

处理后avg_salary_m列的输出和预期完全一致:

[1]  2.50 28.25 10.00

无额外依赖的Base R实现

如果不想安装第三方包,可以用基础R的正则替换实现:

# 自动定位最后一列提取年数
year_col <- as.numeric(gsub(".*?(\\d+\\.?\\d*)-yr.*", "\\1", df[[ncol(df)]]))
# 自动定位最后一列提取总金额
salary_col <- as.numeric(gsub(".*?\\$(\\d+\\.?\\d*)M.*", "\\1", df[[ncol(df)]]))
# 新增结果列
df$avg_salary_m <- salary_col / year_col

内容的提问来源于stack exchange,提问作者LoveMYMAth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:03:24