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

