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

在R语言中从字符型数据提取威士忌ABV数值的问题求助

解决方案

方法1:修正正则表达式(基础R实现)

你的问题源于正则仅匹配整数数字,且未精准定位到%前的酒精度数值。调整正则规则,即可同时捕获整数和小数形式的ABV,再转成整数满足需求:

# 原始数据
name <- c("Aberfeldy, 12 year old, 40%", "Ardbeg, 1974 Vintage, Cask #3524, 49.9%")
price <- c(40, 20000)
example_data <- data.frame(name, price)

# 提取并转换ABV
example_data$ABV <- as.integer(as.numeric(gsub(".*([0-9]+(?:\\.[0-9]+)?)%.*", "\\1", example_data$name)))

# 输出结果
example_data

运行后得到目标格式:

name price ABV
1        Aberfeldy, 12 year old, 40%    40  40
2 Ardbeg, 1974 Vintage, Cask #3524, 49.9% 20000  49

正则规则解释

  • .*:贪婪匹配任意字符,确保定位到最后一个带%的数值(避免误抓年份、桶号等其他数字)
  • ([0-9]+(?:\\.[0-9]+)?):核心捕获组,匹配整数或小数:
    • [0-9]+:匹配1位以上的整数部分
    • (?:\\.[0-9]+)?:可选的小数部分,?:表示非捕获组,?表示该部分可省略
  • %.*:匹配%符号及后续所有字符,完成锚定

方法2:用stringr包简化提取(更直观)

如果允许使用tidyverse工具,stringr::str_extract可以更简洁地实现需求:

library(stringr)

# 提取ABV并转成整数
example_data$ABV <- as.integer(as.numeric(str_extract(example_data$name, "[0-9]+(?:\\.[0-9]+)?(?=%)")))

核心逻辑解释

  • str_extract:直接提取第一个符合模式的字符串
  • (?=%):正向预查规则,确保匹配的数字紧跟在%前,彻底避免误匹配其他数字

原始代码失败原因

你最初的正则.*?([0-9]+).*%存在两个关键问题:

  1. 仅匹配整数数字序列,无法识别带小数点的数值
  2. .*?是非贪婪匹配,会优先抓取字符串中靠前的数字片段,而非%前的目标数值,导致带小数的ABV只抓到了最后一位数字(如49.9%中的9)

内容的提问来源于stack exchange,提问作者Rhys Maredudd Davies

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:15:38