R语言提取IPL 2023薪资列USD数值失败,全为NA求解决
解决IPL 2023薪资数据提取USD数值时全为NA的问题
你的原代码出现全NA的核心问题有两个:一是正则表达式没覆盖带"million"的薪资格式,二是str_extract_all返回列表的处理逻辑有漏洞,且没做单位转换。以下是修正方案:
问题分析
原代码的正则\\(US\\$([0-9.,]+)\\)只能匹配纯数字(带逗号/小数点)的USD部分,像(US$2.0 million)这种带单位的会直接匹配失败,导致提取结果为空,最终转成NA。另外str_extract_all会返回每个元素的所有匹配结果(列表形式),后续处理没考虑到这一点,也没做单位转换。
修正后的代码
library(readxl) library(stringr) # 读取数据 ipl_2023_salaries <- read_excel(file_path) # 提取括号内的USD完整内容(包含数字和单位) usd_raw <- str_extract(ipl_2023_salaries$Salary, "\\(US\\$(.*?)\\)") # 清理内容:去掉括号、US$,保留数字和单位 usd_clean <- str_remove_all(usd_raw, "\\(|\\)|US\\$") # 处理数值和单位转换 usd_values <- sapply(usd_clean, function(x) { if (is.na(x)) { return(NA) } # 去掉千位逗号 x_no_comma <- str_remove_all(x, ",") # 判断是否包含million单位 if (str_detect(x_no_comma, "million")) { # 提取数字并转换为完整数值 num <- as.numeric(str_extract(x_no_comma, "[0-9.]+")) * 1000000 } else { # 直接转换为数值 num <- as.numeric(x_no_comma) } return(num) }) # 替换原薪资列 ipl_2023_salaries$Salary <- usd_values print(ipl_2023_salaries)
关键改进点
- 用
str_extract替代str_extract_all:每个薪资条目只有一个USD数值,单匹配足够,避免列表处理的复杂问题 - 正则调整为
\\(US\\$(.*?)\\):捕获括号内的所有内容,包括带"million"的部分 - 增加单位转换逻辑:识别"million"并将数值放大100万倍,同时处理千位逗号的清理
- 完善NA值处理:确保空值或匹配失败的条目返回NA,不影响整体转换
内容的提问来源于stack exchange,提问作者arg061203
相关产品推荐
相关产品推荐

