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

如何用dplyr::extract从字符列提取多组价格与单位到新列?

从混乱字符列提取多组带单位价格的R解决方案

问题背景

现有一个格式混乱的字符列cost$k1,包含各种价格描述(单价格、多价格、附加说明等),需要从中提取最多4组带p/kWh单位的价格,分别存入新列k2、k3、k4、k5。

核心问题分析

你之前尝试的dplyr::extract()之所以失效,是因为它依赖正则捕获组匹配整个字符串的固定结构,但你的数据行格式完全不统一,没法用一个正则覆盖所有情况的分组匹配。更适合的思路是:先提取所有符合格式的价格,再将提取结果转成宽格式的多列。

解决方案代码

1. 加载所需包

library(dplyr)
library(stringr)
library(tidyr)

2. 提取并整理价格

# 提取每行中所有符合"数字+p/kWh"格式的价格,转成多列
cost_processed <- cost %>%
  # 提取所有匹配项,得到列表格式的列
  mutate(prices = str_extract_all(k1, "\\d+p/kWh")) %>%
  # 将列表列展开为多列,不足4组的填充NA
  unnest_wider(prices, names_sep = "") %>%
  # 重命名展开后的列为k2到k5
  rename_with(~paste0("k", 2:5), starts_with("prices"))

验证示例场景

  • 原数据第4行(k1为"40p/kWh on bp pulse50 units. 50p/kWh on bp pulse150 units."):
    cost_processed$k2[4] # 返回 "40p/kWh"
    cost_processed$k3[4] # 返回 "50p/kWh"
    
  • 原数据第23行(k1为"Polar Subscription - 27p/kWh Polar Free Membership - 42p/kWh Contactless - 42p/kWh"):
    cost_processed$k2[23] # 返回 "27p/kWh"
    cost_processed$k3[23] # 返回 "42p/kWh"
    cost_processed$k4[23] # 返回 "42p/kWh"
    

补充说明

  • 正则\\d+p/kWh专门匹配带p/kWh单位的价格,自动忽略"Free"、固定费用(如£1.50)等无关内容;
  • 若需要提取类似"40p - 20p/kWh"中的40p,可将正则调整为\\d+p(/kWh)?,但需根据实际需求判断;
  • 处理后不足4组价格的行,对应列会自动填充NA,符合数据规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:36:29