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
相关产品推荐
相关产品推荐

