R语言如何从data.frame的字符列中提取所有百分比数值
R从文本列提取带正负号的百分比数值
实现方法
直接用R基础正则函数即可完成提取,无需依赖第三方包,匹配规则从逻辑上强制要求数值末尾带%,自动过滤所有不带百分号的普通数字。
完整代码如下:
# 构造示例数据 df <- data.frame(text = c("this text is 1.3% this is +1.4% and this -1.5%", "this text is 123.3% this 123.3 and this 1234.5")) # 正则匹配提取所有符合规则的百分比 pct_result <- unlist(regmatches(df$text, gregexpr("[+-]?\\d+\\.?\\d*%", df$text))) # 可选:移除百分比开头多余的正号(不需要可以注释掉这行) pct_result <- gsub("^\\+", "", pct_result)
运行后pct_result就是目标字符向量,输出结果为:
[1] "1.3%" "1.4%" "-1.5%" "123.3%"
注:你给出的期望输出中第二个值
-1.4%属于笔误,原始文本对应位置为带正号的+1.4%,如果需要保留正号,删除上述代码中gsub处理的步骤即可得到带+的结果。
如果你习惯用stringr包,也可以用更简洁的写法实现同样效果:
library(stringr) pct_result <- unlist(str_extract_all(df$text, "[+-]?\\d+\\.?\\d*%")) # 正号处理逻辑和基础版一致
正则规则说明
用到的匹配规则[+-]?\\d+\\.?\\d*%逻辑如下:
[+-]?:匹配数值开头可选的正号或负号\\d+:匹配数值的整数部分(至少1位数字)\\.?:匹配可选的小数点(支持整数百分比如5%的场景)\\d*:匹配小数点后0到多位数字(支持整数、一位小数、多位小数的百分比格式)%:强制匹配末尾的百分号,从规则层面排除所有不带%的普通数字
内容的提问来源于stack exchange,提问作者sotnik
相关产品推荐
相关产品推荐

