使用R正则表达式拆分数据框中的价格数值与货币列
R正则拆分价格与货币列解决方案
问题修正与完整实现
你之前的代码存在几个问题:原始数据框定义错误、正则未正确转义、未提取货币列、未处理数值中的逗号。以下是完整可运行的实现:
首先构造正确的数据框:
library(dplyr) library(stringr) library(tidyr) # 构造包含价格列的数据框 df <- data.frame(price = c("50,000 USD", "40,000 EUR", "8,500 GBP"))
方法一:使用tidyr::separate(更直观)
利用正向预查匹配货币前的空格,拆分后处理数值格式:
df_processed <- df %>% separate(price, into = c("priceValue", "currency"), sep = "\\s+(?=\\w{3}$)", # 匹配货币代码前的空格 convert = FALSE) %>% mutate(priceValue = as.numeric(str_replace(priceValue, ",", "")))
方法二:使用stringr系列函数
直接提取货币和数值部分:
df_processed <- df %>% mutate( currency = str_extract(price, "\\w{3}$"), # 提取末尾3位货币代码 priceValue = str_remove(price, "\\s+\\w{3}$") %>% # 移除货币部分 str_replace(",", "") %>% # 去掉千分位逗号 as.numeric() # 转为数值类型 )
关键说明
- 正则
\\s+(?=\\w{3}$):(?=...)是正向预查,确保只匹配紧跟3位字母(货币代码)的空格,避免误拆分数值中的逗号。 - 必须处理数值中的逗号:直接转数值会失败,需先用
str_replace移除逗号。 - R中字符串的正则转义:需用双反斜杠
\\,或使用原始字符串r"{\\s+(?=\w{3}$)}"。
内容的提问来源于stack exchange,提问作者Nick Vigman
相关产品推荐
相关产品推荐

